给定python函数对象,生成其他函数列表

时间:2017-10-24 01:46:32

标签: python introspection

背景

我在非线性优化领域工作,我有一个昂贵的成本函数。成本函数涉及一些令人尴尬的并行代码,我想在多个python进程中分发以逃避GIL。因为这些是独立的进程,所以它们不会从" core"继承全局命名空间/导入。处理。

我的核心流程使用了一些需要很长时间(最多1秒)才能完成的导入。对此的典型解决方案是将所需的导入迁移到并行化函数的主体中。因为它是丑陋的,我想放弃它以换取一些更加丑陋的幕后魔术来处理进口。我还想避免使用每个成本函数评估创建一个新的工作池以避免浪费(高达40%的并行实现和执行时间是进程启动和导入)。

我创建了一个小型库,允许我map对任意数量的长期工作者进行一组函数调用,并在评估成本函数的所有迭代后丢弃/终止它们。这为multiprocessing图书馆的PoolPathos提供了一些灵活性。

任务

假设我有一些文件:

optimizer.py

from mymodule import a,b,c
def cost_function(parameters):
    p = parameters
    pt1 = a(p[0])
    pt2 = b(pt1, p[1])
    pt3 = c(pt2, p[2])
    return pt3.results # looks like [1, 2, 3, 4, 5 ...]

给定cost_function对象,有没有办法构建一个在其中调用的所有函数的列表,而不执行它?

包含builtins等的列表很好。迭代返回的函数列表并过滤掉内置函数相对容易,并且在给定函数名称的情况下定位源(import的位置)。

编辑:下面是我用来产生工作流程的代码

from multiprocessing import Process
def spawn_workers(self, num_workers):
        for i in range(num_workers):
            Process(target=worker_fcn, kwargs=dict(config_dict=self.cfg)).start()

self是指包含一些配置信息的类实例。

0 个答案:

没有答案