我修改了你的功能
chars_array
作为参数,进行了一些速度测试。
def version1(word, chars_array):
chars =[x for x in word]
count = 0
for c in chars:
if not c in chars_array:
count+=1
return count
def version2(word):
return sum([1 for c in [x for x in word] if not c in chars_array])
我还想测试一个没有中间列表结构和@tomothy32的函数的修改版本
solution
用
char_array
通过):
def version1a(word, chars_array):
# remove intermediate list construction from word
count = 0
for c in word:
if not c in chars_array:
count+=1
return count
def version3(word, chars_array):
return len(word.translate(None, ''.join(chars_array)))
设置定时测试:
# first make some random words
import string
import numpy as np
max_word_len = 10
N = 10000
test_words = [
"".join(
np.random.choice(
list(string.ascii_lowercase),
np.random.randint(1, max_word_len)
)
)
for _ in range(N)
]
定时结果:
chars_array = ['a','b','c']
%%timeit
[version1(word, chars_array) for word in test_words]
#100 loops, best of 3: 11.2 ms per loop
%%timeit
[version1a(word, chars_array) for word in test_words]
#100 loops, best of 3: 8.01 ms per loop
%%timeit
[version2(word, chars_array) for word in test_words]
#100 loops, best of 3: 13.2 ms per loop
%%timeit
[version3(word, chars_array) for word in test_words]
#100 loops, best of 3: 5.29 ms per loop
如此清晰
version3()
使用
str.translate
是这里最快的。但如果我们把
查尔阵
在函数之外。
def version3a(word, chars_array):
return len(word.translate(None, chars_array))
重复正时测试:
chars_array = "".join(chars_array)
%%timeit
[version1(word, chars_array) for word in test_words]
#100 loops, best of 3: 10.1 ms per loop
%%timeit
[version1a(word, chars_array) for word in test_words]
#100 loops, best of 3: 6.61 ms per loop
%%timeit
[version2(word, chars_array) for word in test_words]
#100 loops, best of 3: 12 ms per loop
%%timeit
[version3(word, chars_array) for word in test_words]
#100 loops, best of 3: 12 ms per loop
%%timeit
[version3a(word, chars_array) for word in test_words]
#100 loops, best of 3: 3.87 ms per loop