【问题标题】:Python sub-module class instance generationPython子模块类实例生成
【发布时间】: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


    【解决方案1】:

    rv_gen 中的语句将在导入时运行。您的打印之间没有太大的差距,即使在现代 PC 中生成 100k 随机数也不会花费时间

    【讨论】:

    • 抱歉,我编辑了 OP 以获得更多细节和清晰度。最重要的是为什么在编辑子模块后需要额外的 3 分钟,而无需更改(即使从 10M 更改为 9M 数组大小)只需 0.3 秒(正如您和我所期望的)。
    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2017-01-19
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多