2

我正在计算一些非常大的除法问题的答案,并想知道为什么 b=a/c(其中 a 和 c 以及两个正整数)比你输入问题并要求答案要快打印:b=a/c 比 b=a/c 后跟 print b 快得多。

非常慢:

from datetime import datetime - startTime = datetime.now()
a=2**1000000-3
b=a/13
print b
print(datetime.now()-startTime) 

但没有print b它是非常快的。后来我输入c=a%13以查看是否真的发生了任何事情(我对编程还是很陌生),当我输入时它非常快print c(没有print b代码)。

4

3 回答 3

2

您正在尝试输出相当大的数字(大约 10 ^ 300000) - 将其从二进制转换为十进制格式需要时间(我想为此需要进行大约 300000 次除法,内部数字以二进制格式存储)。如果你真的需要以十进制格式输出整数——我认为你不能加快速度。但是您可以快速打印十六进制或二进制格式的数字:

hex(b)
bin(b)

您可以使用Decimaltype 在内部以十进制格式存储数字,但使用这种类型的计算可能会慢得多。

于 2013-10-20T09:10:20.777 回答
2

据我了解,IO 操作很慢,打印到屏幕就像写入文件一样,它会阻塞线程一段时间。

正如有人指出的那样,从数字到字符串的转换也可能需要时间。每当我必须测量某事的时间时。我测量计算的时间并在测量时间后打印任何类型的结果。

为了使程序更快,但占用大量内存,您可以将每个结果保存在一个列表中,然后编译一个大字符串并只打印一次。

重复的打印调用比一次大的打印调用花费更多的时间。

from datetime import datetime

startTime = datetime.now()

a=2**1000000-3
b=a/13

elapsedTime = datetime.now() - startTime

print "Elapsed time %s\n Number: %s" % (elapsedTime, b)
于 2013-10-20T09:19:11.887 回答
0

正如人们指出的那样,IO 很慢。在执行 IO 时,您不知道您的进程将如何安排 - 它可能会被放入等待队列。我不确定你的时间安排是什么,但简单的工程逻辑将决定你想让 IO 占整个运行时间的一小部分(即微不足道)。所以我建议你做 1*10^6 的除法(越多越好),然后假设你只测试数学就做 IO。请注意,您在计算中涉及计算机和操作系统的工作方式。

于 2013-10-20T09:12:58.843 回答