簡體   English   中英

Python:將類方法轉移到另一台計算機

[英]Python: Transfer a class method to another computer

我創建了一個用於分析產生的特定類型數據的類。 我在本地計算機上使用該類,但偶爾有太多數據無法在本地工作,因此我想向其中一種方法添加一個選項,以便它可以將作業提交給計算機集群。 除了我努力將類方法轉移到集群之外,它通常都可以工作。

我的課看起來像這樣

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群集上要創建我保存的靜態方法(即傳遞給該方法例如staticMethod1 )到一個Pickle使用文件dill.dump 然后將Pickle文件傳遞到群集,但是當我嘗試從Pickle文件加載方法時,它說ModuleNotFoundError: No module named 'analysis'的模塊,該模塊可以在Analysis類中找到。

我是否真的需要僅使用靜態方法在群集上重新創建整個類? 誰能建議一個解決此問題的優雅方法,或者提出實現此功能的更好方法? 它需要使用任何靜態方法。 僅供參考,靜態方法之一是from sklearn.metrics.cluster import adjusted_rand_score使用from sklearn.metrics.cluster import adjusted_rand_score以防萬一可能會影響使用dill的解決方案。

我是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()
>>>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM