0

这两个代码位都做同样的事情:

g = 1
g += 2
g += 17
print g

g = []
g.append(1)
g.append(2)
g.append(17)
print sum(g)

我只是想知道其中一种方法是否比另一种“更好”或更多 Python。我自己使用以下代码进行测试:

import time

n = 1000000

A = time.clock()
w = 0
for i in range(n):
    w += i
print w, time.clock() - A

A = time.clock()
g = []
for i in range(n):
    g.append( i )
print sum(g), time.clock() - A

似乎表明第一种方法稍微快一些,但我可能会遗漏一些东西。或者我可能会错过执行此类操作的更好方法。欢迎任何意见。

4

5 回答 5

4

这不是 Pythonic 的问题,而是你想要实现的目标。

是否要保存构成总和的值以便以后参考?如果是这样,请使用列表。如果不是,那为什么还要费心列出清单呢?这只是做同样事情的一种复杂且效率较低的方法——只需将值相加即可。直接添加方法显然会更快,因为您所做的只是添加到变量(非常便宜),而不是改变列表(成本更高)。更不用说使用直接加法的明显内存优势了,因为你不会存储无用的数字。

于 2013-10-19T20:37:07.867 回答
3

方法A是

  1. 添加整数

方法 B 是

  1. 创建整数列表
  2. 添加整数

如果你想做的只是

  1. 添加整数

我会选择方法A。

于 2013-10-19T20:38:16.563 回答
1

使用第二种方法的唯一原因是您打算g在代码的其他地方使用该列表。否则,没有理由采用第二种方式。制作一个列表然后将其值求和比增加一个变量的成本要高得多。

此外,如果增加g是您的目标,那么为什么不这样做呢?“显式优于隐式”是 Python 的座右铭。第一种方法显式递增g

此外,该列表可能会使人们感到困惑。当他们看到您的代码时,他们会认为您需要该列表并计划在其他地方使用它。更不用说g现在是一个列表。如果g应该是一个数字,让它成为一个列表是不好的,并且可能会导致问题。

最后,第一个解决方案的语法更少(如果它有效地完成相同的工作,总是一个加号)。

所以,我会选择方法1。

于 2013-10-19T20:45:12.230 回答
1

绝对是第一个,出于多种原因,首先是内存分配(N 个整数而不是一个整数)和性能:在现实世界的应用程序中,GC 开销会突然出现。

于 2013-10-19T20:58:14.060 回答
0

编辑:忽略这一点,我现在可以看到它通常不是正确的,并且仅适用于 x 的特定值。

好的,所以我可以看到制作列表应该是低效的,但是为什么 fun2 在这种情况下运行得更快呢?它本质上不是创建一个列表然后对其求和吗?

import timeit

def fun1(x):
    w = 0
    for i in range(x):
        w += i
    return w 

def fun2(x):
    return sum([i for i in range(x)])

timer = timeit.Timer(stmt='fun1(10000)', setup='from __main__ import fun1')
print timer.timeit(number=10000)


timer = timeit.Timer(stmt='fun2(10000)', setup='from __main__ import fun2')
print timer.timeit(number=10000)
于 2013-10-19T21:10:53.753 回答