【发布时间】:2021-04-19 10:26:53
【问题描述】:
我想将随机数的生成放到一个子模块中(“rv_gen.py”);我不清楚随机数数组(或类?)的实例是在导入语句时生成的,还是仅在将其分配给变量rvclass(在主模块中)时生成?
令人费解的是时间:在我更改随机数数组的大小后,输出(见下文)不同,并且花费的时间出乎意料的长(我预计 10M 正常 rvs 需要几秒钟):
更改(并保存)“rv_gen”后,将立即打印下面输出的前三行直到第二个print('rvs generation finished!'),但是下一个打印语句“导入时间:...”需要几分钟(不仅仅是所述的“3.1 秒”)。紧接着剩下的三张照片紧随其后。我曾预计每个“rvs generation完成”打印之前的主要时间延迟......?
如果我只是重新运行主模块而不对子模块进行任何更改,则输出类似,除了缺少下面的第一行 print('rvs generation finished!'),并且在现在读取 Time for import: 0.3 seconds 的语句之前不需要额外的分钟。
主模块“main.py”:
import timeit
lastt = timeit.default_timer()
import rv_gen
thist = timeit.default_timer(); print('Time for import: %4.1f seconds.' % ( thist-lastt)) ; lastt = thist
rvclass = rv_gen.s
thist = timeit.default_timer(); print('Time for assignment: %4.1f seconds.' % ( thist-lastt)) ; lastt = thist
print(rvclass.rans[:5])
模块“rv_gen.py”:
import numpy as np
class struct:
pass
s = struct()
s.rans = np.random.normal(size=1000*1000*50)
print('rvs generation finished!')
输出(更新 rv_gen.py 后):
rvs generation finished!
Reloaded modules: rv_gen
rvs generation finished!
Time for import: 3.1 seconds.
Time for assignment: 0.0 seconds.
[ 0.925 -0.728 2.387 -0.683 -0.021]
编辑:现在得到一个“MemoryError”:我只是在将随机数组大小更改为 10M 后重新运行代码,并得到以下输出(再次出现第一个 rvs generation finished! 打印输出,大约 3 分钟后出现其余的):
rvs generation finished!
[autoreload of rv_gen failed: Traceback (most recent call last):
File "C:\Anaconda\lib\site-packages\IPython\extensions\autoreload.py", line 245, in check
superreload(m, reload, self.old_objects)
File "C:\Anaconda\lib\site-packages\IPython\extensions\autoreload.py", line 450, in superreload
update_generic(old_obj, new_obj)
File "C:\Anaconda\lib\site-packages\IPython\extensions\autoreload.py", line 387, in update_generic
update(a, b)
File "C:\Anaconda\lib\site-packages\IPython\extensions\autoreload.py", line 357, in update_class
update_instances(old, new)
File "C:\Anaconda\lib\site-packages\IPython\extensions\autoreload.py", line 312, in update_instances
update_instances(old, new, obj.__dict__, visited)
File "C:\Anaconda\lib\site-packages\IPython\extensions\autoreload.py", line 317, in update_instances
update_instances(old, new, obj, visited)
File "C:\Anaconda\lib\site-packages\IPython\extensions\autoreload.py", line 302, in update_instances
visited.update({id(obj):obj})
MemoryError
]
Reloaded modules: rv_gen
rvs generation finished!
Time for import: 0.4 seconds.
Time for assignment: 0.0 seconds.
[-0.091 1.087 -0.329 0.359 -1.884]
我正在使用 Anaconda Spyder 3.3.6 和 IPython。
【问题讨论】:
标签: python class module instance reload