【发布时间】:2014-04-02 05:15:33
【问题描述】:
根据博文here,any() + 生成器表达式应该比 for 循环运行得更快,看来他的推理是有道理的。
但是我尝试过使用这种方法(尽管在其他一些函数上),但它的运行时间似乎比显式 for 循环要长。
def with_loop(a, b):
for x in xrange(1, b):
if x * a % b == 1: return True
return False
def with_generator(a, b):
return any(x * a % b == 1 for x in xrange(1, b))
基本上,代码循环遍历从 1 到 b 的所有数字,以查找数字 a 是否具有模逆。
我从运行这些函数中得到的时间是:
>>> from timeit import Timer as T
>>> T(lambda : with_generator(100, 300)).repeat(number = 100000)
[3.4041796334919923, 3.6303230626526215, 3.6714475531563266]
>>> T(lambda : with_loop(100, 300)).repeat(number = 100000)
[2.1977450660490376, 2.2083902291327604, 2.1905292602997406]
>>> T(lambda : with_generator(101, 300)).repeat(number = 100000)
[1.213779524696747, 1.2228346702509043, 1.2216941170634072]
>>> T(lambda : with_loop(101, 300)).repeat(number = 100000)
[0.7431202233722161, 0.7444361146951906, 0.7525384471628058]
with_generator(100,300) 返回 False,with_generator(101,300) 返回 True。
似乎 with_generator 的运行时间总是比 with_loop 长。这有什么原因吗?
编辑: 是否有任何其他更短或更优雅的方式来重写 with_loop 以便我们获得相似或更好的性能?谢谢!
【问题讨论】:
-
进一步了解下面用户的回答,是否还有其他“更优雅”或更短的方式来编写上面的代码,但仍能达到与 with_loop 相似/更好的速度?
标签: performance python-2.7 for-loop generator any