【发布时间】:2017-09-26 10:16:39
【问题描述】:
我写了一个简单的脚本来测试速度,这就是我发现的。实际上 for 循环在我的情况下是最快的。这真的让我吃惊,看看下面(计算平方和)。那是因为它在内存中保存了列表还是有意的?谁能解释一下。
from functools import reduce
import datetime
def time_it(func, numbers, *args):
start_t = datetime.datetime.now()
for i in range(numbers):
func(args[0])
print (datetime.datetime.now()-start_t)
def square_sum1(numbers):
return reduce(lambda sum, next: sum+next**2, numbers, 0)
def square_sum2(numbers):
a = 0
for i in numbers:
i = i**2
a += i
return a
def square_sum3(numbers):
sqrt = lambda x: x**2
return sum(map(sqrt, numbers))
def square_sum4(numbers):
return(sum([i**2 for i in numbers]))
time_it(square_sum1, 100000, [1, 2, 5, 3, 1, 2, 5, 3])
time_it(square_sum2, 100000, [1, 2, 5, 3, 1, 2, 5, 3])
time_it(square_sum3, 100000, [1, 2, 5, 3, 1, 2, 5, 3])
time_it(square_sum4, 100000, [1, 2, 5, 3, 1, 2, 5, 3])
0:00:00.302000 #Reduce
0:00:00.144000 #For loop
0:00:00.318000 #Map
0:00:00.290000 #List comprehension`
更新 - 当我尝试更长的循环时会有结果。
time_it(square_sum1, 100, range(1000))
time_it(square_sum2, 100, range(1000))
time_it(square_sum3, 100, range(1000))
time_it(square_sum4, 100, range(1000))
0:00:00.068992
0:00:00.062955
0:00:00.069022
0:00:00.057446
【问题讨论】:
-
顺便说一句,这是衡量执行速度的一种不同寻常的方法。使用
time.time更为常见。但是使用timeit模块会更好。您应该尝试使用生成器表达式而不是列表推导sum:sum(i**2 for i in numbers);也可以试试sum(i*i for i in numbers)。 -
好问题;我喜欢你真的把所有相关信息都放进去了;以如此简洁的方式!
标签: python performance for-loop mapreduce list-comprehension