このソリューションをProject Euler #5に書きました。
import time
start_time = time.time()
def ProjectEulerFive (m = 20):
a = m
start = 2
while (m % start) == 0:
start += 1
b = start
while b < m:
if ( a % b) != 0:
a += m
b = start
continue
else:
b += 1
return a
import sys
if (len(sys.argv)) > 2:
print "error: this function takes a max of 1 argument"
elif (len(sys.argv)) == 2:
print ProjectEulerFive(int(sys.argv[1]))
else:
print ProjectEulerFive();
print "took " + str(time.time() - start_time ) + " seconds"
私のシステムでは約 8.5 秒かかります。
次に、他の人々のソリューションと比較することにしました。この Project Euler 5 in Python を見つけました - ソリューションを最適化するにはどうすればよいですか? .
一意素因数分解は考えていませんでした。
とにかく、そこに投稿された最適化された非素因数分解ベースのソリューションの1つ:
import time
start_time = time.time()
check_list = [11, 13, 14, 16, 17, 18, 19, 20]
def find_solution(step):
for num in xrange(step, 999999999, step):
if all(num % n == 0 for n in check_list):
return num
return None
if __name__ == '__main__':
solution = find_solution(20)
if solution is None:
print "No answer found"
else:
print "found an answer:", solution
print "took " + str(time.time() - start_time ) + " seconds"
私のシステムには約 37 秒かかります
3、4、5、6、7、8、9、10、および 12 の割り切れる可能性を不必要にチェックしているにもかかわらず、私のコードは約 4 倍高速です。
私はPythonを初めて使用し、非効率性がどこから来ているのかを理解するのに苦労しています。
編集:
私は別のテストをしました。
import time
start_time = time.time()
def ProjectEulerFive (m = 20):
ls = [11, 13, 14, 15, 16, 17, 18, 19]
a = m
i = 0
while i < len(ls):
if ( a % ls[i]) != 0:
a += m
i = 0
continue
else:
i += 1
return a
print ProjectEulerFive();
print "took " + str(time.time() - start_time ) + " seconds"
私のシステムは6秒かかりますが、これは:
import time
start_time = time.time()
def ProjectEulerFive (m = 20):
a = m
start = 11
b = start
while b < m:
if ( a % b) != 0:
a += m
b = start
continue
else:
b += 1
return a
print ProjectEulerFive()
print "took " + str(time.time() - start_time ) + " seconds"
約3.7秒