Yos*_*shi 6 python profiling hpc numba
我有一个相当复杂的计算代码,我正在尝试加速和实现多线程。为了优化代码,我试图确定哪些函数使用时间最长或被调用最多。
我之前还没有真正分析过代码,所以我可能会丢失一些东西。但是,我知道由于LLVM的重新编译,许多现有的分析模块实际上不能与numba的njit()装饰器配合使用。
所以我的问题是:配置代码的最佳方法是什么,其中大多数函数具有njit()装饰器,并带有一些非固定控件功能?
我之前遇到过data_profiler,但是它似乎不再位于conda存储库中,并且我不知道如何从conda中的源代码构建它,或者它是否仍与其依赖关系的现代版本兼容。
我在 QuantFX 模块开发上花费了数十年的时间,同时使用了numba其他矢量化/jit 加速工具,让我分享一些经验,这些经验对于我们具有类似动机的分析来说被认为是方便的。
与所提到的相反data_profiler,对于毫秒,我们享受微秒分辨率,这是使用 ZeroMQ 模块的副作用,用于分布式信令/消息传递基础设施。
ZeroMQ 的所有服务都在一个名为 a 的核心引擎中实现Context,但有一个小型实用程序可以独立于该仪器而免费重用,a Stopwatch- 微秒分辨率计时器类。
因此,没有什么可以阻止我们:
from pyzmq import Stopwatch as MyClock
aClock_A = MyClock(); aClock_B = MyClock(); aClock_C = MyClock(); print( "ACK: A,B,C made" )
# may use 'em when "framing" a code-execution block:
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 ) )
# may add 'em into call-signatures and pass 'em and/or re-use 'em inside whatever our code
aReturnedVALUE = aNumbaPreCompiledCODE( 1234,
"myCode with a need to profile on several levels",
aClock_A, # several,
aClock_B, # pre-instantiated,
aClock_C # Stopwatch instances, so as
) # to avoid chained latencies
Run Code Online (Sandbox Code Playgroud)
这样,如果确实被迫使用至少这个作为最后手段的工具,则可以将任何基于 的分析结构“硬连接”到自己的源代码中Stopwatch。唯一的限制是需要符合实例的有限状态自动机Stopwatch,其中一旦.start()调用了一个方法,.stop()接下来只能有一个方法,类似地,.stop()在尚未完成.start()的实例上调用该方法将很自然地抛出例外。
通用try-except-finally脚手架将有助于确定所有 Stopwatch 实例碰巧再次变为.stop()-ed,即使可能发生了异常。
“硬连线”分析的结构取决于代码执行“测试下的热点”,甚至取决于调用相关开销的“跨界”分析,这些开销在 @jit 修饰的 numba-LLVM 的本机 python 调用之间花费-ed 代码并在 numba 编译的代码“内部”开始第一行(即调用调用和参数分析之间需要多长时间,由调用签名列表驱动或主要通过强制执行单个显式避免, 呼号 )
祝你好运。希望它可以帮助你。