这两者之间有什么性能差异吗?
for item in collection:
if item == badItem:
break
else
doFunction(item)
这是:
for item in collection:
if item == badItem:
break
doFunction(item)
假设我做了数亿次,所以任何性能差异都会有所帮助。
编辑:我实际上并不是根据这个问题的结果来实现这个问题,我只是想知道理论上什么更快。我只是好奇。
发布于 2014-01-21 20:31:44
这听起来像是预成熟的优化:不要这么做.
如果有必要的话,在尝试优化程序之前,您应该让程序正常工作。
如果你完成的应用程序被证明比你需要的慢,那么度量,度量,度量。使用分析工具。那些缓慢的部分可能会让你吃惊。不要浪费时间修理那些不能证明速度慢的部件。
但是回到第一点:不要试图优化一个没有功能完成的程序.
发布于 2014-01-21 20:37:11
正如格兰特·伯奇迈尔所说:测量,测量,测量。
在我使用Python 3.3.1 (default, Apr 17 2013, 22:30:32) [GCC 4.7.3] on linux
的框中,我得到了以下结果:
testA 0.7911653139999544
testB 0.7868194140028208
testC 0.7771379340010753
使用:
collection = [random.randint (1, 10000000) for _ in range (10000000) ]
badItem = 0
collection [5000000] = 0
def doFunction (item): pass
def testA ():
for item in collection:
if item == badItem: break
else: doFunction (item)
def testB ():
for item in collection:
if item == badItem: break
doFunction (item)
def testC ():
badIndex = collection.index (badItem)
for item in collection [:badIndex]:
doFunction (item)
YMMV.我只是比较ints和没有真实世界的数据。我不知道你的__eq__
有多贵,doFunction
做什么,等等。
发布于 2014-01-21 20:45:18
Grant's answer是正确的:如果您关心性能,首先让代码运行,然后measure需要改进什么,最后改进这些东西。
对于后人来说,这是我的计时结果。简单的回答是:没有真正的区别,甚至超过数十亿次的迭代。
With Else:
min: 0.001327058799944325
max: 0.0037289344766406884
mean: 0.002665085947631951
Without Else:
min: 0.0013189987034252226
max: 0.003550914613782652
mean: 0.002147321588495288
守则如下:
C:\>python
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> else_version = timeit.repeat('for i in c:\n\tif i == 0: break\n\telse:i += 1','import random;c=[random.randint(0,1) for _ in range(1000000)]', number = 10000, repeat=10)
>>> nelse_version = timeit.repeat('for i in c:\n\tif i == 0: break\n\ti += 1','import random;c=[random.randint(0,1) for _ in range(1000000)]', number = 10000, repeat=10)
>>> min(else_version)
0.001327058799944325
>>> max(else_version)
0.0037289344766406884
>>> sum(else_version)/10
0.002665085947631951
>>>
>>> min(nelse_version)
0.0013189987034252226
>>> max(nelse_version)
0.003550914613782652
>>> sum(nelse_version)/10
0.002147321588495288
>>>
不管else
语句的实际成本是多少,它显然与您正在执行的任何实际操作(比如__eq__
实现、实际doFunction
是什么,甚至是机器上发生的其他事情)相比都显得相形见绌。
https://stackoverflow.com/questions/21268296
复制相似问题