【问题标题】:Python: Transfer a class method to another computerPython:将类方法传输到另一台计算机
【发布时间】:2018-10-28 14:43:54
【问题描述】:

我创建了一个类,用于分析我生成的特定类型的数据。我在本地计算机上使用这个类,但偶尔有太多数据无法在本地工作,所以我想为其中一种方法添加一个选项,以便它可以将作业提交到计算机集群。除了我正在努力将类方法转移到集群之外,它大部分都有效。

我的班级是这样的

class Analysis():
    def __init__(self, INPUT_PARAMETERS ETC):
        self.data
        OTHER_STUFF...
    @staticmethod
    def staticMethod1(input1, input2):
        # PERFORM SOME KIND OF CALCULATION ON INPUT1 AND INPUT2 AND RETURN THE RESULT
        return output

    @staticmethod
    def staticMethod2(input1, input2):
        # PERFORM SOME KIND OF CALCULATION ON INPUT1 AND INPUT2 AND RETURN THE RESULT
        return output

    # MORE STATIC METHODS

    @staticmethod
    def staticMethodN(input1, input2):
        # PERFORM SOME KIND OF CALCULATION ON INPUT1 AND INPUT2 AND RETURN THE RESULT
        return output

    def createArray(self, function):
        # CREATE AN ARRAY BY APPLYING FUNCTION TO SELF.DATA
        return array

所以createArray 方法被调用并且用户传递应该用于计算数组的静态方法。当我希望在集群上创建createArray 中的数组时,我使用dill.dump 将静态方法(传递给此方法,例如staticMethod1)保存到Pickle 文件中。然后将Pickle 文件传递​​给集群,但是当我尝试从Pickle 文件加载方法时,它显示ModuleNotFoundError: No module named 'analysis',这是可以在其中找到Analysis 类的模块。

我真的需要在集群上重新创建整个类才能使用静态方法吗?任何人都可以建议一个优雅的解决这个问题或建议一个更好的方法来实现这个功能吗?它需要使用任何静态方法。仅供参考,其中一种静态方法使用from sklearn.metrics.cluster import adjusted_rand_score,以防可能影响使用dill 的解决方案。

【问题讨论】:

    标签: python dill


    【解决方案1】:

    我是dill 作者。 dill 能够将类方法传递给另一台计算机,如下所示。

    >$ python
    Python 3.5.6 (default, Sep 20 2018, 12:15:10) 
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> class Foo(object):
    ...   def bar(self, x):
    ...     return self.y + x
    ...   def __init__(self, y):
    ...     self.y = y
    ... 
    >>> import dill
    >>>          
    >>> f = Foo(5)
    >>>                  
    >>> with open('foo.pkl', 'wb') as pkl:
    ...   dill.dump(f.bar, pkl)
    ... 
    >>>
    

    然后在新会话中(或在另一台计算机上)...

    >$ python
    Python 3.5.6 (default, Sep 20 2018, 12:15:10) 
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import dill
    >>> with open('foo.pkl', 'rb') as pkl:
    ...   b = dill.load(pkl)
    ... 
    >>> b(4)
    9
    

    如果没有您提供更具体的代码,很难说为什么您没有看到这种行为...但dill 确实提供了将类定义(或只是类方法)传递给另一台计算机的能力。

    这种行为使pathos 之类的代码能够将类方法传递给ParallelPoolProcessPool 内的另一台计算机——后者是跨进程的,而前者可以跨分布式资源。

    dude>$ python
    Python 3.5.6 (default, Sep 20 2018, 12:15:10) 
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 
    >>> class Foo(object):
    ...   def bar(self, x):
    ...     return self.y + x
    ...   def __init__(self, y):
    ...     self.y = y
    ... 
    >>> import pathos
    >>> p = pathos.pools.ParallelPool()
    >>> p.map(Foo(4).bar, [1,2,3])
    [5, 6, 7]
    >>> p.close(); p.join()
    >>>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多