我在读这个post的时候,发现一个代码是:
jokes=range(1000000)
domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]
我想,在列表理解之外计算len(笑话)的值不是更好吗?
好吧,我试过了,计时了三个代码
jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]'
10000000 loops, best of 3: 0.0352 usec per loop
jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);l=len(jokes);domain=[(0,(l*2)-i-1) for i in range(0,l*2)]'
10000000 loops, best of 3: 0.0343 usec per loop
jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);l=len(jokes)*2;domain=[(0,l-i-1) for i in range(0,l)]'
10000000 loops, best of 3: 0.0333 usec per loop
观察第一个和第二个之间2.55%的边际差异使我认为-是第一个列表理解
domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]
由python内部优化?或者2.55%是足够大的优化(假设len(笑话)=1000000)?
如果这是-Python中的其他隐式/内部优化是什么?
什么是developer's rules of thumb for optimization in Python
?
Edit1:由于大多数答案都是“不优化,如果速度慢,请稍后再做”,我从Triptych
和Ali A
获得了一些提示和链接。
我会把问题改一点,并要求不要这样做。
我们能从那些面临“慢”的人那里得到一些经验吗?问题是什么?是如何解决的?
Edit2:对于那些还没有到这里的人来说,是一个interesting read
Edit3:有关timeit
的不正确用法,请参见dF的正确用法的答案,以及三个代码的计时。
读这个:Python Speed / Performance Tips
另外,在您的示例中,总时间非常短,以至于误差范围将超过速度上的任何实际差异。
您没有正确地使用^{} :
-s
(setup)的参数是一个最初要执行一次的语句,因此您实际上只是在测试一个空语句。你想这么做虽然提速仍不显著,但更为显著(分别为16%和25%)。因此,由于它不会使代码变得更复杂,所以这种简单的优化可能是值得的。
为了解决实际问题。。。Python中通常的经验法则是
在编码时,更倾向于直接易读的代码而不是优化。
分析您的代码(^{} and ^{} 是您的朋友)以找出需要优化的内容(通常是像紧循环这样的东西)。
最后,将它们重新实现为C扩展,这对于像pyrex和cython这样的工具来说要容易得多。
需要注意的一点是:与许多其他语言相比,函数调用在Python中相对昂贵,这就是为什么示例中的优化产生了影响,尽管
len
对于列表来说是O(1)。这适用于所有编程,而不仅仅是Python:
我甚至补充说,除非你有一个导致疼痛的缓慢问题,否则不要费心做任何事情。
也许最重要的是单元测试将在实际过程中帮助您。
相关问题 更多 >
编程相关推荐