如果没有别的办法,让我们试一试:
在QuantFX模块开发中,我们花费了数十年的时间,使用过numba
和其他向量化/ jit加速工具。让我分享一些经验,这些经验被认为对于我们类似的分析很有用。
与提到的data_profiler
相反,我们享受使用ZeroMQ模块所提供的微秒级分辨率,用于分布式信令/消息基础设施。
ZeroMQ将其所有服务实现在一个名为Context
的核心引擎中,但有一个小型实用程序可独立于此仪器重复使用,即Stopwatch
- 一个微秒级分辨率计时器类。
因此,没有什么能阻止我们:
from pyzmq import Stopwatch as MyClock
aClock_A = MyClock(); aClock_B = MyClock(); aClock_C = MyClock(); print( "ACK: A,B,C made" )
aClock_A.start(); _ = sum( [ aNumOfCollatzConjectureSteps( N ) for N in range( 10**10 ) ] ); TASK_A_us = aClock_A.stop()
print( "INF: Collatz-task took {0:} [us] ".format( TASK_A_us ) )
aReturnedVALUE = aNumbaPreCompiledCODE( 1234,
"myCode with a need to profile on several levels",
aClock_A,
aClock_B,
aClock_C
)
通过至少使用这个工具作为最后一道防线,可以将任何基于
Stopwatch
的性能分析结构“硬编码”到自己的源代码中。唯一的限制是需要符合
Stopwatch
实例的有限状态自动机,其中一旦调用了
.start()
方法,只能接下来调用
.stop()
方法,并且类似地,在尚未
.start()
的实例上调用
.stop()
方法将自然引发异常。
常见的
try-except-finally
脚手架将有助于确保所有
Stopwatch
实例再次
.stop()
,即使可能发生异常。
“硬编码”性能分析的结构取决于您的代码执行“热点”测试和跨边界调用相关开销的性能分析,这些开销在@jit装饰的numba-LLVM-ed代码的本机python调用和启动numba编译代码内部的第一行之间花费的时间(即在调用调用和参数分析之间需要多长时间,由调用签名列表驱动或通过强制使用单个显式调用签名来避免)。
祝你好运。希望这可以帮到你。
njit
中设置cache=True
选项吗?借助像 Spyder IDE 中实现的分析器,它内部使用cProfile
,这也是一种手动分析的好模块。 - JE_Muc