【发布时间】:2012-09-03 23:30:35
【问题描述】:
我有一个正在计算的脚本:
def sumsquared(arr):
sum = 0
idx = 0
len = arr.__len__()
while idx < (len - 1):
sum = sum + (arr[idx] * arr[idx]) + (arr[idx+1] * arr[idx+1])
idx = idx + 2
return sum
上述函数在一个循环中调用,该循环填充两个列表并调用此函数两次:第一次使用 len ~ 1024 个项目的列表,第二次使用 len ~ 44100 个项目。循环本身可以运行 100 到 100000 次,具体取决于输入。
对于小尺寸输入,基于cProfile 的分析会通知我:
ncalls tottime percall cumtime percall filename:lineno(function)
---------------------------------------------------------------------
2560 12.065 0.005 12.065 0.005 beat.py:8(sumsquared)
这大约是脚本总运行时间的 95%。有什么方法可以加快这个功能吗?
【问题讨论】:
-
你应该可以使用len = len(arr),不需要调用.__len__()
-
@monkut 这不起作用,因为
len是函数中的一个局部变量,它将阻止访问内置的len()。然而,WeaklyTyped 应该能够做到length = len(arr) -
是的,或者只使用 len(arr) 本身而不是创建变量。
-
在这种情况下,不是每次循环检查条件时都会调用 len(arr) 吗?
标签: python optimization