在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 【问题描述】:

我正在尝试使用 cProfilepstats 库对我的代码进行基准测试。这是我目前得到的代码:

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 是一个函数,epsidelta_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,在其上调用.runnot 采用filename 参数),然后打电话给.dump_stats(filename)。您可以手动执行相同的操作,将 .run 调用替换为 .runcall 调用。

以上是关于在python中将函数传递给cProfile的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在Python中将多个参数传递给pool.map()函数[重复]

在函数-ggplot中将参数传递给构面网格

在 C# 中将查询参数作为参数传递给 BigQuery 中的 IN 运算符的正确方法

在 Eclipse(Pydev) 中将命令行参数传递给 Python 脚本

在 python 3. 数字猜谜游戏中将许多参数传递给输入

如何在firebase函数中将参数传递给cors