我知道有一个"用于Python 2.7的Microsoft Visual C++编译器",但目前或计划中是否有用于Python 3.4的Microsoft Visual C++编译器或用于Python 3.x的Microsoft Visual C++编译器?如果我不必在整个实验室安装不同版本的visual studio,那将是非常有益的.
我想multiprocessing在Python中使用该库.遗憾地multiprocessing使用pickle不支持闭包,lambdas或函数的函数__main__.所有这三个对我来说都很重要
In [1]: import pickle
In [2]: pickle.dumps(lambda x: x)
PicklingError: Can't pickle <function <lambda> at 0x23c0e60>: it's not found as __main__.<lambda>
Run Code Online (Sandbox Code Playgroud)
幸运的是,有dill一个更健壮的泡菜.显然dill在导入时执行魔术以使泡菜工作
In [3]: import dill
In [4]: pickle.dumps(lambda x: x)
Out[4]: "cdill.dill\n_load_type\np0\n(S'FunctionType'\np1 ...
Run Code Online (Sandbox Code Playgroud)
这非常令人鼓舞,特别是因为我无法访问多处理源代码.可悲的是,我仍然无法得到这个非常基本的例子
import multiprocessing as mp
import dill
p = mp.Pool(4)
print p.map(lambda x: x**2, range(10))
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我错过了什么?究竟是multiprocessing+ dill组合的限制是什么?
mrockli@mrockli-notebook:~/workspace/toolz$ python testmp.py
Temporary Edit for J.F Sebastian
mrockli@mrockli-notebook:~/workspace/toolz$ python testmp.py
Exception …Run Code Online (Sandbox Code Playgroud) 我在多处理模块中使用Pool.map_async()(以及Pool.map())时遇到问题.我已经实现了一个并行循环函数,只要函数输入到Pool.map_async是一个"常规"函数,它就能正常工作.当函数是例如类的方法时,我得到一个PicklingError:
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Run Code Online (Sandbox Code Playgroud)
我只使用Python进行科学计算,所以我对酸洗的概念不太熟悉,今天就对它进行了一些了解.我在使用python的多处理Pool.map()时已经看过几个先前的答案,比如无法选择<type'instancemethod'>,但我无法弄清楚如何使它工作,即使遵循提供的链接回答.
我的代码,目标是使用多个内核模拟Normal rv的向量.请注意,这只是一个示例,可能甚至没有在多个内核上运行的回报.
import multiprocessing as mp
import scipy as sp
import scipy.stats as spstat
def parfor(func, args, static_arg = None, nWorkers = 8, chunksize = None):
"""
Purpose: Evaluate function using Multiple cores.
Input:
func - Function to evaluate in parallel
arg - Array of arguments to evaluate func(arg)
static_arg - The "static" argument (if any), i.e. the variables that are constant in the evaluation …Run Code Online (Sandbox Code Playgroud) 我正在对我的代码应用一些并行化,我在其中使用类.我知道如果不采用Python提供的任何其他方法,就不可能选择类方法.我在这里找到了解决方案.在我的代码中,我必须使用类来并行化部分.在这里,我发布了一个非常简单的代码,只是代表我的结构(是相同的,但是我删除了方法内容,这是很多数学计算,对于我得到的输出来说是微不足道的).问题是'因为我可以腌制一种方法(shepard_interpolation),但是另一种方法(calculate_orientation_uncertainty)我得到了泡菜错误.我不知道为什么会这样,或者为什么它会起作用.
def _pickle_method(method):
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
if func_name.startswith('__') and not func_name.endswith('__'): #deal with mangled names
cls_name = cls.__name__.lstrip('_')
func_name = '_' + cls_name + func_name
print cls
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.__mro__:
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
class ImageData(object):
def __init__(self, width=60, height=60):
self.width = width
self.height = height
self.data = []
for i in range(width):
self.data.append([0] …Run Code Online (Sandbox Code Playgroud) 简而言之,我说有以下内容:
import multiprocessing
class Worker(multiprocessing.Process):
def __init__(self):
multiprocessing.Process.__init__(self)
print "Init"
self.value = None
def run(self):
print "Running"
self.value = 1
p = Worker()
p.start()
p.join()
print p.value
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
Init
Running
1
Run Code Online (Sandbox Code Playgroud)
相反,它是
Init
Running
None
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么会这样吗?我不理解的是什么,我该如何正确地做到这一点?
谢谢.
我编写了这段代码来测试我的计算机上的Python多处理:
from multiprocessing import Pool
var = range(5000000)
def test_func(i):
return i+1
if __name__ == '__main__':
p = Pool()
var = p.map(test_func, var)
Run Code Online (Sandbox Code Playgroud)
我使用Unix的time命令计时,结果如下:
real 0m2.914s
user 0m4.705s
sys 0m1.406s
Run Code Online (Sandbox Code Playgroud)
然后,使用相同var和test_func()我定时:
var = map(test_func, var)
Run Code Online (Sandbox Code Playgroud)
结果是
real 0m1.785s
user 0m1.548s
sys 0m0.214s
Run Code Online (Sandbox Code Playgroud)
多处理代码不应该比普通的代码快得多map吗?