Как да избирам типове методи на клас Python (т.е. за многопроцесорна обработка)?

Как да избирам типове методи на клас Python? Не е внедрен в стандартната библиотека. Открих, че мога да използвам някои модули на трети страни като dill, но как да го направя само с pickle.

Подготвих тестов код, за да опростя този въпрос:

import pickle

class Thing(object):
  @staticmethod
  def static_method():
    print Thing.static_method.__name__

  @classmethod
  def class_method(cls):
    print cls.class_method.__name__

  def object_method(self):
    print self.object_method.__name__


def main():
  items = [Thing,
           Thing(),
           Thing.static_method,
           Thing.class_method,
           Thing.object_method,
           Thing().object_method]
  for i, item in enumerate(items):
    try:
      pickle.loads(pickle.dumps(item))
    except Exception as ex:
      print i, ex, item

if __name__ == '__main__':
  main()

Как да се справим с липсата по подразбиране на поддръжка на pickle за методи в Python 2.7?

2 Can't pickle <function static_method at 0x025614F0>: it's not found as __main__.static_method <function static_method at 0x025614F0>
3 can't pickle instancemethod objects <bound method type.class_method of <class '__main__.Thing'>>
4 can't pickle instancemethod objects <unbound method Thing.object_method>
5 can't pickle instancemethod objects <bound method Thing.object_method of <__main__.Thing object at 0x024F71D0>>

person Chameleon    schedule 20.02.2015    source източник
comment
Виждали ли сте този много подобен въпрос?: stackoverflow.com/questions/9470403/pickling-class-method   -  person ajdigregorio    schedule 20.02.2015
comment
Аз съм dill авторът. Защо да се придържате към pickle, когато dill може да изчисти всичките ви items?   -  person Mike McKerns    schedule 20.02.2015
comment
Ако е така, защото искате да използвате multiprocessing, тогава можете просто да използвате моето разклонение на multiprocessing, наречено pathos.multiprocessing. Той използва dill сериализатора, така че можете да изпратите всяко от вашите items във функция map. Например вижте: stackoverflow.com/questions/1816958/   -  person Mike McKerns    schedule 20.02.2015
comment
@MikeMcKerns Чувствам, че dill е твърде голям, за да реши този проблем (разходи за зареждане + загубена памет) - мога да избера някакъв код от dill и да използвам, но не искам да зареждам всички, тъй като се изисква само някаква функция - мисля, че това ще бъде 1% от 100%.   -  person Chameleon    schedule 20.02.2015
comment
@paintedcones Прочетох отговора, но не го намерих за полезен - намерих някои по-добри отговори, но без да реша проблема на @staticmethod.   -  person Chameleon    schedule 20.02.2015
comment
@MikeMcKerns Ще тествам и пробвам dill, но не мисля, че това е добре, защото моите ограничения и не съм сигурен дали е Чист питон - страхотна работа е, какъвто и код да трябва да бъде малко изчистен/документиран, за да направи тази библиотека по-популярна, това е впечатлението ми на пръв поглед .   -  person Chameleon    schedule 20.02.2015
comment
@MikeMcKerns Правя някакъв тест и той генерира около 7M + 0,45 s отпечатък - времето е ок. и използването на паметта е високо, каквото и да е ок. за много приложения dropbox .com/s/bjrkxw2sfzwfuns/   -  person Chameleon    schedule 20.02.2015
comment
Това е чист питон. Също така съм много наясно с намаляването на времето за зареждане, тъй като основно използвам dill като средство за активиране на високопроизводителни паралелни и разпределени изчисления в python. Използването на паметта е малко високо първоначално b/c той изгражда и регистрира (в регистъра pickle) минимална версия на много от обектите в стандартната библиотека. Допълнителната памет, консумирана след импортиране, е минимална.   -  person Mike McKerns    schedule 20.02.2015
comment
@MikeMcKerns Много е добре, че е чист Python. Уча библиотека. Мисля, че натоварването tme е ок. но отпечатъкът на паметта е висок за някои употреби (Ако имате високо мащабируем сървър с нишка, ограничена до 128M, за да обслужвате повече потребители с изключен отговор 1s) и няма проблем, ако го използвате на компютър. Предпочитам библиотеки със зареждане при поискване, тъй като ако обедините много неща с инициализиращ отпечатък, това ще сумира над 1s, което изобщо не е проблем в научното приложение или масовата обработка.   -  person Chameleon    schedule 20.02.2015
comment
@MikeMcKerns Мога ли да извлека малко код от вашата библиотека и за олекотена версия на dill и да го използвам в търговско приложение? Мога да споделя код чрез GitHub, ако има нужда, или да докладвам за някои грешки на dill. Каквото и да имам нужда от лека библиотека за ускоряване на кода. Вашият лиценз поддържа ли го?   -  person Chameleon    schedule 20.02.2015
comment
Това е BSD лиценз. Имайте го. Вече се използва в търговската мрежа. Моля, докладвайте за грешки и споделяйте код чрез github.   -  person Mike McKerns    schedule 20.02.2015
comment
@Mike McKerns Единственият бъг, който наблюдавам, не обработва __class_mangled това, което е маркирано за fixme, изглежда, че е лесно за коригиране. Открих, че ще направя мултипроцесирането по-просто, като използвам обратно извикване, така че опитвам модел на map/task/reduce - така че класът ще извика някаква глобална дефиниция, използвайки self като параметър - това ще позволи добро наследяване и кодът ще бъде лек, което ми харесва.   -  person Chameleon    schedule 22.02.2015