在python中将函数传递给cProfile的正确方法是啥?
Posted
技术标签:
【中文标题】在python中将函数传递给cProfile的正确方法是啥?【英文标题】:Whats the correct way to pass a function to cProfile in python?在python中将函数传递给cProfile的正确方法是什么? 【发布时间】:2020-06-18 13:23:52 【问题描述】:我正在尝试使用 cProfile
和 pstats
库对我的代码进行基准测试。这是我目前得到的代码:
profile = cProfile.Profile()
profile.runcall(gillespie_tau_leaping(propensity_calc, popul_num, LHS, stoch_rate, popul_num_all, tao_all, rxn_vector, delta_t, tao, epsi))
ps = pstats.Stats(profile)
ps.print_stats()
我正在尝试对 gillespie_tau_leaping
函数进行基准测试,该函数的输入都是数组,但 propensity_calc
是一个函数,epsi
和 delta_t
是常量。
目前我收到以下错误:
File "c:/Users/Mike/visual studio code project/MSc dissertation code/tau_leaping_variant_ssa.py", line 190, in <module>
profile.runcall(gillespie_tau_leaping(propensity_calc, popul_num, LHS, stoch_rate, popul_num_all, tao_all, rxn_vector, delta_t, tao, epsi))
TypeError: 'tuple' object is not callable
上线profile.runcall(gillespie_tau_leaping(propensity_calc, popul_num, LHS, stoch_rate, popul_num_all, tao_all, rxn_vector, delta_t, tao, epsi))
我之前遇到过类似的问题,我实际上并没有将函数作为参数传递,而是调用函数并将结果(这是一个元组)传递给内置函数,根据文档需要一个函数传递给它。
这里是不是同样的问题,如果是,我该如何解决(我上次没弄明白)
干杯
【问题讨论】:
【参考方案1】:为此,以及大多数类似的函数,您将函数本身(未调用)传递给函数,然后将参数作为参数传递给runcall
; it's documented 采用 func
,然后是 varargs 和 kwargs(*args
和 **kwargs
)。您所做的只是删除函数的调用括号,并在函数后放置一个逗号以将其与其参数分开:
profile.runcall(gillespie_tau_leaping, propensity_calc, popul_num, LHS, stoch_rate, popul_num_all, tao_all, rxn_vector, delta_t, tao, epsi)
【讨论】:
runcall()
可以输出到文件吗?文档说:“您可以通过为 run()
函数指定文件名来将结果保存到文件中,而不是在配置文件运行结束时打印输出”。 runcall()
有类似的东西吗?文档几乎没有提到它,而且这两个函数的源代码似乎都表明文件路径被接受。
@KurtWheeler:是的,profile.run
(模块级函数)是profile.Profile
对象的各种方法的包装器。 AFAICT,profile.run
,当传递一个filename
参数时,大致相当于创建一个profile.Profile
,在其上调用.run
(not 采用filename
参数),然后打电话给.dump_stats(filename)
。您可以手动执行相同的操作,将 .run
调用替换为 .runcall
调用。以上是关于在python中将函数传递给cProfile的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在Python中将多个参数传递给pool.map()函数[重复]
在 C# 中将查询参数作为参数传递给 BigQuery 中的 IN 运算符的正确方法