【发布时间】:2022-01-09 10:14:30
【问题描述】:
我在https://www.practicepython.org/ 上做一些简单的Python 练习时,我在https://www.practicepython.org/exercise/2014/02/26/04-divisors.html 上做这个任务。
我想测试不同的方法来编写答案,我在评论字段中看到了引起我兴趣的解决方案;两个代码看起来相似,但一个比另一个快 4000%!
代码:
import time
start = time.time()
print("Fast code:")
#the slow code
def divisor(x):
divisors = []
for i in range(1, int(x)):
if x % i == 0:
divisors.append(i)
divisors.sort()
print(divisors)
divisor(50000000)
end = time.time()
print("Time elapsed: ")
print(end - start)
print("Fast code:")
start = time.time()
#the fast code!
def divisor2(x):
divisors = []
for i in range(1, int(x**.5)):
if x % i == 0:
divisors.append(i)
divisors.append(x//i)
divisors.sort()
print(divisors)
divisor2(50000000)
end = time.time()
print("Time elapsed: ")
print(end - start)
经过的时间(慢代码):
3.1739981174468994
经过的时间(快速代码):
0.0010004043579101562
谁能告诉我这是怎么可能的,所以也许任何人都可以为他们的工具带带回家一些宝贵的更快的编码技能?
【问题讨论】:
-
你明白
x和square root of x的区别吗? -
这两个版本也比必要的慢,因为它们在每个循环迭代中都排序。如果它们只在最后排序会更好。
-
对于初学者来说,一个是迭代直到
x,另一个是迭代直到int(x**0.5)...对于像50000000这样的数字,所以第一个迭代是50000000,而第二个是7071迭代... -
这两个函数也被“破坏”了——它们都应该将范围末尾增加 1 并使用集合而不是列表。尝试使用
16,您将分别得到[1, 2, 4, 8]和[1, 2, 8, 16]。通过我建议的修复,它们都产生[1, 2, 4, 8, 16](在对集合进行一次排序之后)。 -
@juanpa.arrivillaga 是的,用于除数,否则
4将出现两次16。
标签: python function performance time