def test_data_gen():
from random import sample
for i in range(1,5):
n = 10**i
population = set(range(1,100000))
some_list = sample(list(population),n)
population.difference_update(some_list)
some_dict = dict(zip(sample(population,n),
sample(range(1,100000),n)))
yield "Population Size of {}".format(n), (some_list, some_dict), {}
使用内置的any可以在两个循环上获得一些性能优势
但你可能需要测量你的里程数。如果list和dict仍然非常静态,并且必须多次执行比较,那么可以考虑使用set
^{pr2}$注意Python3.X,默认情况下返回视图而不是序列,因此在使用Python3.X时,它将是直接向前的
在以上两种情况下,您可以用bool来包装结果,以获得布尔值结果
异教徒
我的好奇心占了我的上风,我把所有提出的解决办法都计时了。原来的解决方案在性能方面似乎更好。以下是结果
随机产生的样本输入
测试引擎
我重写了答案的测试部分,因为它很混乱,答案受到了相当好的关注。我创建了一个timeit compare python模块并将其移动到github
试验结果
以及上述模块的图形比较
结论
过早的优化是有害的。显然,当测试域发生变化时,没有一个解具有最佳性能。根据总体规模和迭代频率,解决方案的性能差异很大。结果再次说明了这样一个事实:在Python中,应该确保代码是可读的,而不是确保代码在某些情况下要么是漂亮的,要么是针对性能进行了优化的,但是这样就可能无法扩展。在
注意有人怀疑为什么不使用ifilter会比其他方法更好
众所周知,在python中,调用C函数时会有开销,如果总体规模较小但迭代频率较高,则C函数调用开销的累积会慢慢显现出来。从图中可以看出,使用ifilter时,总体规模较低,但迭代次数较高,因此性能会有很大的偏差。在
最干净、最快的方法是使用any()和itertools.ifilter():
此代码使用:
someDict.__contains__
作为谓词您也可以使用itertools.imap()而不是ifilter()。在
相关问题 更多 >
编程相关推荐