我的尝试是帮助您获得最快、最易读的版本。为此,我的建议是首先创建一个生成器,它将产生您想要的值。然后在这个生成器上执行内置max()
函数。这更快/更有效的原因几乎与将生成器嵌入max()
函数中相同,在 Python 中仅使用局部变量比使用全局变量更快,一旦max()
函数不必像x[0][1]
更快那样查找索引。
vals = (abs(x[0][1]) for x in dCF3v)
print max(vals)
定时:
我使用以下代码计算了我的答案和mgilsons答案之间的差异:
import time
dCF3v = [[(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)]]
def method_inbar(l):
vals = (abs(x[0][1]) for x in l)
max(vals)
def method_mgilson(l):
max(abs(x[0][1]) for x in l)
def timer(multiplier=[1,10,100,1000]):
for m in multiplier:
print "timing the speed using multiplier: %s" % m
now = time.time()
for i in range(100000):
method_inbar(dCF3v*m)
print "inbar's method: %r" % (time.time() - now)
now = time.time()
for i in range(100000):
method_mgilson(dCF3v*m)
print "mgilson's method: %r" % (time.time() - now)
timer()
这将每次在更大的数据集上运行测试:
>>>
timing the speed using multiplier: 1
inbar's method: 0.18899989128112793
mgilson's method: 0.192000150680542
timing the speed using multiplier: 10
inbar's method: 0.8540000915527344
mgilson's method: 0.8229999542236328
timing the speed using multiplier: 100
inbar's method: 7.287999868392944
mgilson's method: 7.45199990272522
timing the speed using multiplier: 1000
inbar's method: 71.42099976539612
mgilson's method: 77.18499994277954
如您所见,在大量数据上。它更快。唯一的原因是速度较慢是因为启动 vals 需要时间,而且由于我多次运行这些函数,它似乎慢得多,但如果你只运行一次,那么对于较小的数据集你应该没有什么区别,但是对于大型数据集,您应该会感觉到很大的差异。(只有 1000 次的几秒钟)