我将尝试执行以下 Python 代码,它将按字母顺序返回“ABCDEGGHIJK”的第一个排列。这需要一个非常简单的排序算法,正如在欧拉计划问题336中定义的那样,需要进行最大数量的迭代才能完成排序。
以下是代码(对于糟糕的变量名称,我表示歉意):
这段代码在我的两台机器上都可以正常运行且得出正确答案,但我发现在我两台机器上的速度差异非常大,高达20倍。我的理论上更快的i5电脑运行Linux Mint和Python 2.7.6,并且拥有更多内存,但是当我运行此代码时,我发现它的执行速度比我较慢的Celeron计算机要慢得多,后者运行Windows和Python 3.5.1。无论我在哪台机器上运行这个代码时,我都不会同时运行其他任何东西,它们都使用相同的IDE(Spyder),所以我不知道为什么会有这种速度差异?如果你能提供任何帮助或原因来解释这一点,那将不胜感激。
编辑:根据Chriss的建议,我尝试在我较慢的计算机上运行Python 2.7并且它也比在同一台计算机上运行3.5时慢得多。因此,这种差异是由Python版本引起的,但是到底是什么引起了这种差异,我仍然想知道。
以下是代码(对于糟糕的变量名称,我表示歉意):
from itertools import permutations
def first_out_letter(st):
"""
returns the first letter alphabetically in st which is not in sorted order
alphabetically, string must be all in captials.
"""
def first(string):
"""
returns the first alphabetical letter in a string, only capitals allowed
"""
alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in alpha:
if i in string:
return i
return None
sor = ''.join(sorted(st))
for i in range(len(st)):
if st[i] != sor[i]:
return first(st[i:])
return None
def get_arrangement_size(arrang,dictionary):
"""
returns the number of shifts needed to arrange a string in lexographic order
using a dumb method of first getting the first digit correct, then the second
and so on...
the argument dictionary stores precomputed results and is modified during execution.
"""
if arrang in dictionary.keys():
return dictionary[arrang]
sor = ''.join(sorted(arrang))
if arrang == sor:
dictionary[arrang] = 0
return 0
else:
bing = first_out_letter(arrang)
num_arr = 0
pos_bing = 0
for i in range(len(arrang)):
if arrang[i] == sor[i]:
num_arr += 1
else:
break
for i in range(len(arrang)):
if arrang[i] != bing:
pos_bing += 1
else:
break
if bing == arrang[-1]:
low = get_arrangement_size(arrang[:num_arr]+arrang[num_arr:][::-1],dictionary)
else:
low = get_arrangement_size(arrang[:pos_bing]+arrang[pos_bing:][::-1],dictionary)
dictionary[arrang] = low+1
return low+1
solutions = {}
letters = ["A","B","C","D","E","F","G","H","I","J","K"]
piv = permutations(letters)
for item in piv:
get_arrangement_size(''.join(item),solutions) #builds up the solutions dictionary
ma = max(solutions.values())
fir = []
for item in solutions.keys():
if solutions[item] == ma:
fir.append(item)
fir = sorted(fir)
print(fir[0])
这段代码在我的两台机器上都可以正常运行且得出正确答案,但我发现在我两台机器上的速度差异非常大,高达20倍。我的理论上更快的i5电脑运行Linux Mint和Python 2.7.6,并且拥有更多内存,但是当我运行此代码时,我发现它的执行速度比我较慢的Celeron计算机要慢得多,后者运行Windows和Python 3.5.1。无论我在哪台机器上运行这个代码时,我都不会同时运行其他任何东西,它们都使用相同的IDE(Spyder),所以我不知道为什么会有这种速度差异?如果你能提供任何帮助或原因来解释这一点,那将不胜感激。
编辑:根据Chriss的建议,我尝试在我较慢的计算机上运行Python 2.7并且它也比在同一台计算机上运行3.5时慢得多。因此,这种差异是由Python版本引起的,但是到底是什么引起了这种差异,我仍然想知道。
range
差异引起的。您可以尝试将所有的range
调用转换为xrange
,并在Python 2上运行它,看看是否有所帮助?我想亲自操作,但原始代码在我的机器上会导致内存错误... - niemmi