2014-11-24 106 views
0

我正在计算一个路线的总距离(对于旅行商问题),我很好奇哪个更好:总结一个整数列表,或者使用total + = value(不知道是什么这个技术术语是......我认为的连接?)。换句话说:出于好奇:哪个更适合创建总和?总和(列表)与积累

totalDistance = [distance(location, location+1) for location in route] 
return sum(totalDistance) 

totalDistance = 0 
for location in route: 
    totalDistance += distance(location, location+1) 
return totalDistance 

距离()返回一个int值和位置的数量为不同的路线约0至100之间变化。 对任何一种方法的想法(或完全不同的方式)表示赞赏!

编辑:

积累,而不是连锁。

+0

我认为你的意思是*积累*而不是*连接*。你的意思是*更好*,更快? – Thibaut 2014-11-24 01:47:14

+0

这就是我正在寻找的词!更好的是,我想我的意思是更快,更清洁,记忆力更强。 – josibake 2014-11-24 01:49:33

+0

“更快”可以分析,但我的钱在列表comp。 “清洁”是主观的 - 人们喜欢以不同的方式看待事物。 “内存密集型”绝对是将发生器表达式相加的例子,'total_dist = sum(distance(location,location + 1)for location in route)' – 2014-11-24 01:53:26

回答

2

为什么不使用generator expressionsum

return sum(distance(location, location+1) for location in route) 

该解决方案避免了创造一个像第一个解决方案不必要的列表(节省内存消耗),并且也有很多比第二(清洁计数)更简洁。

这就是说,你总是可以合并第一溶液加入一个班轮:

return sum([distance(location, location+1) for location in route]) 

不过,正如我上面所说的,为什么创建一个列表只是把它扔掉?

+1

你是否介绍了这个?我有这样的印象:列表理解/生成器表达式通常比'for'循环更快。 – Thibaut 2014-11-24 01:56:28

+0

我喜欢这个..我没有意识到你可以在同一行上总结一个生成器表达式! – josibake 2014-11-24 02:01:40

+0

我认为生成器表达式更快 – 2014-11-24 02:11:33

1

最好是只使用一台发电机表达sum

return sum(distance(location, location+1) for location in route) 

这节省了创建列表的开销。 totalDistance = [路由中位置的距离(位置,位置+ 1)]

for循环版本也不会创建列表。没问题,只是比使用sum稍微详细些。 sum精确存在这种情况

location+1如何工作?似乎应该从路线


对于利率成为下一个项目我比较了PyPy 2.2.1 @iCodez例子。每个函数的第一次运行是允许的JIT编译功能

>>>> from timeit import timeit 
>>>> def f(): 
....  number = 0 
....  for i in range(100): 
....   number += 1 
.... 
>>>> timeit(f) 
0.3245859146118164 
>>>> timeit(f) 
0.2913198471069336 

>>>> def g(): 
....  lst = [i for i in range(100)] 
....  sum(lst) 
.... 
>>>> timeit(g) 
0.8840188980102539 
>>>> timeit(g) 
0.8698201179504395 

>>>> def h(): 
....  sum(i for i in range(100)) 
.... 
>>>> timeit(h) 
2.8281970024108887 
>>>> timeit(h) 
2.8702847957611084 

Wow..genexp性能差很多

+0

这不是我的实际代码 - 只是一个粗略的想法。我写的是距离(位置[我],地点[我+ 1]我在范围内(len(地点)-1)' – josibake 2014-11-24 02:07:20

0

在我的机器,通过发电机迭代比列表慢:

from timeit import timeit 

# just for simulation 
def distance(la, lb): 
    return abs(la-lb) 

# for simulation, too  
def route(): 
    return xrange(10000) 

# the longer(code) and faster but wasteful(memory) way 
def longer_faster_wasteful(): 
    return sum([distance(location, location+1) for location in route()]) 

# the shorter(code) and saving(memory) but slower way 
def shorter_slower_saving(): 
    return sum(distance(location, location+1) for location in route()) 

# print 2.01163072818 on my machine 
print timeit(longer_faster_wasteful, number=100) 

# print 2.91834802689 on my machine 
print timeit(shorter_slower_saving, number=100)