【发布时间】:2013-05-29 09:23:58
【问题描述】:
我在这种方法中运行循环大约 100 万次,但可能由于 O(n^2) 需要很多时间,所以有什么方法可以改进这两个模块:-
def genIndexList(length,ID):
indexInfoList = []
id = list(str(ID))
for i in range(length):
i3 = (str(decimalToBase3(i)))
while len(i3) != 12:
i3 = '0' + i3
p = (int(str(ID)[0]) + int(i3[0]) + int(i3[2]) + int(i3[4]) + int(i3[6]) + int(i3[8]) + int(i3[10]))%3
indexInfoList.append(str(ID)+i3+str(p))
return indexInfoList
这是将数字转换为base3的方法:-
def decimalToBase3(num):
i = 0
if num != 0 and num != 1 and num != 2:
number = ""
while num != 0 :
remainder = num % 3
num = num / 3
number = str(remainder) + number
return int(number)
else:
return num
我正在使用python做一个软件,这两个功能是其中的一部分。请指出为什么这两个方法这么慢以及如何提高这些方法的效率。
【问题讨论】:
-
我可以看到一些改进,是的,但是预期的输入和输出是什么?
-
首先调用 getIndexList 方法,其中我提供一些巨大列表的长度作为参数,ID 是任何 2 位数字,我返回一个新列表,其项目附加有提供长度的原始列表。基本上一些细节被添加到原始列表中。
-
为什么不传入列表本身?
-
如果我通过了列表也没有用,那又如何呢?每次我需要将项目附加到我认为效率不高的列表时。
-
关于循环的效率,您可以尝试直接增加以 3 为底的数组表示,而不是每次增加以 2 为底的表示并转换它们。好吧,事实上,为什么不直接增加 string 表示。
标签: algorithm python-2.7 big-o performance