【发布时间】:2015-07-11 10:49:39
【问题描述】:
这个问题和我前几天发的other one有关;我已经阅读了this question 关于与multiprocessing 使用实例方法进行酸洗相关的问题。问题是我不明白如何将提供的解决方案应用于我的案例:
def _pickle_method(method):
# Author: Steven Bethard
# http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
cls_name = ''
if func_name.startswith('__') and not func_name.endswith('__'):
cls_name = cls.__name__.lstrip('_')
if cls_name:
func_name = '_' + cls_name + func_name
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
# Author: Steven Bethard
# http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)
class Circle(Feature):
# Stuff...
def __points_distance(self,points):
xa = n.array([self.xc,self.yc]).reshape((1,2))
d = n.abs(dist.cdist(points,xa) - self.radius)
return d
def points_distance(self,points,pool=None):
if pool:
return pool.map(self.__points_distance,points)
else:
return self.__points_distance(points)
这会在运行时出现ValueError: XA must be a 2-dimensional array 错误:
import tra.features as fts
import numpy as np
import multiprocessing as mp
points = np.random.random(size=(1000,2))
circle_points = np.random.random(size=(3,2))
feature = fts.Circle(circle_points)
pool = mp.Pool()
ds = feature.points_distance(points,pool=pool)
但它(显然)在这样做时起作用:
pool = None
ds = feature.points_distance(points,pool=pool)
有什么线索吗?
这与this 不同(我检查了this 实现),因为该方法在另一个类中使用,该类实例化Circle 类并调用其points_distance 方法。在任何情况下,另一个区别是points_distance 方法使用scipy.spatial.distance.cdist,它期望(n,2) 形numpy.ndarray。它在使用串行版本时有效,但在并行使用时会引发我提到的异常。我想有一个与 cPickle 一起传递的参数的警告。
【问题讨论】:
-
@User 感谢您的帮助。我已经检查了您提供的答案,但目前不适用于我。
标签: python python-2.7 distance python-multiprocessing