【发布时间】:2017-05-30 23:22:13
【问题描述】:
我写了两个功能相同的函数 f 和 g
def f(l, count):
if count > 1:
for i in f(l, count-1):
yield i + 1
else:
yield from l
for i in f(range(100000),900):
pass
print('f')
和
def g(l, count):
if count > 1:
tmp = []
for i in g(l, count-1):
tmp.append(i+1)
return tmp
else:
return l
for i in g(range(100000),900):
pass
print('f')
和我 我认为 f 应该更快,但 g 在运行时更快
时间到了
real 0m5.977s
user 0m5.956s
sys 0m0.020s
时间到了
real 0m7.389s
user 0m7.376s
sys 0m0.012s
【问题讨论】:
-
我不知道 python 的细节。但总的来说,上下文更改比函数返回更昂贵。
-
timeit模块应该会给你更精确的结果。并且:在else部分,你做了两件完全不同的事情!在g中,您只需返回对列表l的引用;在f中,您遍历列表和yield单独的每个项目。还有:你的输入列表l是什么? -
您的示例代码有错误。
for i in h(...那应该是f,而不是h。当我更正此问题并在我的计算机上运行代码时,我得到的结果与你相反。 ` -
else部分只运行一次,不会消耗太多时间
-
@skyking: 从 python 3.3 开始你可以
yield from一个可迭代对象。