【发布时间】:2020-07-02 21:24:13
【问题描述】:
我的 Python 版本是 3.8.2,我使用 Visual Studio Code 1.43.1 编写代码。 我正在使用蒙特卡洛方法估计 pi 的值。
事实证明,当我使用 random.random() 生成随机数时,在发布模式下大约需要 1.4 秒,在调试器中大约需要 1.6 秒。但是当我将 random.random() 切换到 random.uniform(0,1) 时,在发布模式下大约需要 1.9 秒,在调试器中大约需要 6.5 秒。
我想运行时间会增加是合理的,因为每次生成一个数字,uniform函数都会做一次额外的计算。但是为什么发布模式只增加了一点点,而在调试器中使用的时间却增加了近 3 倍呢?这种现象背后的机制是什么?还是我的调试器有问题?
我的代码如下所示。我已经删除了调试器中的所有断点。由于我是 Python 的初学者,所以我没有对设置做太多改动。
from random import random,uniform
from time import perf_counter
LEN=1000000
COUNT=0
start=perf_counter()
for i in range(LEN):
x,y=uniform(0,1),uniform(0,1) #switch between random() and uniform(0,1)
dist=pow(x**2+y**2,0.5)
if dist<=1.0:
COUNT+=1
pi=4*COUNT/LEN
end=perf_counter()
print("pi={:10f}".format(pi))
print("time consumed:{:f}".format(end-start))
【问题讨论】:
-
请注意,
uniform比random多了两个参数。也许调试器存储和维护参数的开销解释了时间差异。 -
这可能与
random.uniform是您调用的唯一用 Python 而不是 C 实现的事实有关,因此它是调试器唯一可以在您编写的部分之外实际调试的东西. -
我自定义了一个与
uniform定义相同的新函数。这次它的运行速度与使用内置的uniform一样慢。它是否确认是开销中添加的两个参数产生了影响?@PeterO. -
对不起,我不太明白 vscode Python 调试器和 C 之间的关系。你能告诉我更多关于那个或在哪里可以找到相关信息的信息吗? @user2357112支持莫妮卡
-
我也用 C 语言编写了这个程序,并使用 gdb 作为调试器。 (为了获得相应的运行时间,我将循环大小增加到 50000000。)这次使用 gdb 并没有像 Python 调试器那样增加运行时间。鉴于此,我想知道添加 2 个参数可以产生如此巨大的变化这一事实是否是这种特定 python 调试器或 python 语言本身的固有特性?@PeterO。
标签: python random vscode-debugger