该pickle参考文献指出可以酸洗的物体组是相当有限的.实际上,我有一个函数返回一个dinamically生成的类,我发现我不能pickle该类的实例:
>>> import pickle
>>> def f():
... class A: pass
... return A
...
>>> LocalA = f()
>>> la = LocalA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(la, f, pickle.HIGHEST_PROTOCOL)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: Can't pickle local object 'f.<locals>.A'
Run Code Online (Sandbox Code Playgroud)
这些对象太复杂了pickle.好.现在,有什么神奇的,如果我试图挑选一个类似的对象,但是派生类,它就可以了!
>>> class DerivedA(LocalA): pass
...
>>> da = DerivedA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(da, f, pickle.HIGHEST_PROTOCOL)
...
>>>
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?如果这很容易,为什么不 …
我正在使用python 3.3.3.我正在从tutorialspoint.com上做教程.我无法理解这个错误是什么.
这是我的代码:
fo = open("foo.txt", "w")
print ("Name of the file: ", fo.name)
# Assuming file has following 5 lines
# This is 1st line
# This is 2nd line
# This is 3rd line
# This is 4th line
# This is 5th line
seq = ["This is 6th line\n", "This is 7th line"]
# Write sequence of lines at the end of the file.
fo.seek(0, 2)
line = fo.writelines( seq )
# Now read complete file from …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Python的pathos将计算指定到单独的进程中,以便使用多核处理器加速它.我的代码组织如下:
class:
def foo(self,name):
...
setattr(self,name,something)
...
def boo(self):
for name in list:
self.foo(name)
Run Code Online (Sandbox Code Playgroud)
由于我在multiprocessing.Pool中遇到酸洗问题,我决定尝试使用pathos.我尝试过,如前几个主题中所述:
import pathos.multiprocessing
Run Code Online (Sandbox Code Playgroud)
但它导致错误:没有模块多处理 - 我在最新的病毒版本中找不到.
然后我尝试修改boo方法:
def boo(self):
import pathos
pathos.pp_map.pp_map(self.foo,list)
Run Code Online (Sandbox Code Playgroud)
现在没有抛出错误,但是foo不起作用 - 我的类的实例没有新的属性.请帮助我,因为在花了一天之后,我不知道接下来要去哪里.
我正在尝试在阵列上存储5000个数据元素.这5000个元素存储在现有文件中(因此它不是空的).
但我收到一个错误,我不知道是什么导致它.
在:
def array():
name = 'puntos.df4'
m = open(name, 'rb')
v = []*5000
m.seek(-5000, io.SEEK_END)
fp = m.tell()
sz = os.path.getsize(name)
while fp < sz:
pt = pickle.load(m)
v.append(pt)
m.close()
return v
Run Code Online (Sandbox Code Playgroud)
OUT:
line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.
Run Code Online (Sandbox Code Playgroud) 此代码在Linux上运行良好,但在Windows下失败(预期).我知道多处理模块用于fork()生成一个新进程,因此父进程拥有的文件描述符(即打开的套接字)由子进程继承.但是,我的理解是,您可以通过多处理发送的唯一类型的数据需要是可选择的.在Windows和Linux上,套接字对象不是pickleable.
from socket import socket, AF_INET, SOCK_STREAM
import multiprocessing as mp
import pickle
sock = socket(AF_INET, SOCK_STREAM)
sock.connect(("www.python.org", 80))
sock.sendall(b"GET / HTTP/1.1\r\nHost: www.python.org\r\n\r\n")
try:
pickle.dumps(sock)
except TypeError:
print("sock is not pickleable")
def foo(obj):
print("Received: {}".format(type(obj)))
data, done = [], False
while not done:
tmp = obj.recv(1024)
done = len(tmp) < 1024
data.append(tmp)
data = b"".join(data)
print(data.decode())
proc = mp.Process(target=foo, args=(sock,))
proc.start()
proc.join()
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么一个socket对象,一个明显不可拾取的对象,可以通过多处理传递?是不是像Windows那样使用泡菜?
当map具有不同长度的输入时,填充值None用于缺少的输入:
>>> x = [[1,2,3,4],[5,6]]
>>> map(lambda *x:x, *x)
[(1, 5), (2, 6), (3, None), (4, None)]
Run Code Online (Sandbox Code Playgroud)
这与以下行为相同:
>>> import itertools
>>> list(itertools.izip_longest(*x))
[(1, 5), (2, 6), (3, None), (4, None)]
Run Code Online (Sandbox Code Playgroud)
是什么原因导致map了这种行为,而不是以下情况?
>>> map(lambda *x:x, *x)
[(1, 5), (2, 6), (3,), (4,)]
Run Code Online (Sandbox Code Playgroud)
...并有一个简单的方法来获得后者的行为或者与一些味道zip还是map?
嗨,我一直在为这个早上的大部分时间而苦苦挣扎,希望有人能指出我正确的方向.
这是我目前的代码:
def f(tup):
return some_complex_function(*tup)
def main():
pool = Pool(processes=4)
#import and process data omitted
_args = [(x.some_func1, .05, x.some_func2) for x in list_of_some_class]
results = pool.map(f, _args)
print results
Run Code Online (Sandbox Code Playgroud)
我得到的第一个错误是:
> Exception in thread Thread-2: Traceback (most recent call last):
> File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
> self.run() File "/usr/lib/python2.7/threading.py", line 504, in run
> self.__target(*self.__args, **self.__kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in
> _handle_tasks
> put(task) PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激.
我使用python和Sympy很新...并且使用sympy解决了多变量不等式问题.
假设我在文件中有很多函数,如下所示:
cst**(sqrt(x)/2)/cst
exp(sqrt(cst*x**(1/4)))
log(log(sqrt(cst + exp(x))))
(y**(1/4) + y)**cst
sqrt(y/log(x))/cst
sqrt(cst**log(cst) + x)
(y**2)**(x/4)
sqrt(y*sqrt(cst**y))
log(sqrt(2)*sqrt(cst)*x)
Run Code Online (Sandbox Code Playgroud)
我需要派生它们,设置常量的值并检查是否,对于每个函数f,
df/dx > 0
df/dy < 0
Run Code Online (Sandbox Code Playgroud)
x在[0,+ oo]中,y在[0,1]中.
推导我使用:
dx = diff(f, x)
dy = diff(f, y)
Run Code Online (Sandbox Code Playgroud)
然后当我尝试:
cst = 2 #(for example)
solve(dx > 0)
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/sympy/solvers/solvers.py", line 634, in solve
symbols=symbols)
File "/usr/local/lib/python2.7/dist-packages/sympy/solvers/inequalities.py", line 374, in reduce_inequalities
raise NotImplementedError("only univariate inequalities are supported")
NotImplementedError: only univariate inequalities are …Run Code Online (Sandbox Code Playgroud) 我正在分发一个python包,我期望包作者在不久的将来合并我的更改.包作者不经常发布,所以我希望我的临时fork作为我的其他一些包的依赖.我需要为我的fork创建一个合适的版本号,它符合pip/setuptools.
让我们说当前的版本是1.6.4,我希望作者的下一个版本是1.6.5.叉的适当版本是1.6.4.1或者1.6.5.dev20140520?两者似乎都符合PEP440,但我也有过最近版本的pip未找到dev版本的经验,除非您专门使用该pre标志.这似乎1.6.4.1是一个不错的选择,但我不知道格式pip会有多快乐N.N.N.N(例如将pip它视为一个pre版本?).
这有什么标准惯例吗?注意,我不想更改作者包的名称,但我确实需要一个临时的fork,我的其他包可以安装,而且问题很少.
我有一个随机行走功能,numpy.random用于执行随机步骤。该功能walk本身就可以正常工作。同时,它在大多数情况下都可以正常工作,但是与结合使用时multiprocessing,它会失败。为什么multiprocessing会出错?
import numpy as np
def walk(x, n=100, box=.5, delta=.2):
"perform a random walk"
w = np.cumsum(x + np.random.uniform(-delta,delta,n))
w = np.where(abs(w) > box)[0]
return w[0] if len(w) else n
N = 10
# run N trials, all starting from x=0
pwalk = np.vectorize(walk)
print pwalk(np.zeros(N))
# run again, using list comprehension instead of ufunc
print [walk(0) for i in range(N)]
# run again, using multiprocessing's map
import multiprocessing as mp
p …Run Code Online (Sandbox Code Playgroud) 我是python中的新手,我想知道是否有解决此问题的方法:
我知道这可能听起来很奇怪,但我想将pickle.dump数据保存到变量中.我开始认为,我可以绕过它,通过制作一个假类而不是写入文件,写入一个变量:
class PickleDatatoVar(object):
def __init__(self):
self.data = None
def write(self, data):
self.data = data
def get(self):
return self.data
Run Code Online (Sandbox Code Playgroud)
然后:
pick = PickleDatatoVar()
pickle.dump(Int, pick)
var = pick.get()
Run Code Online (Sandbox Code Playgroud)
没有任何内容显示为错误,但输出只是一个'.'
那么有没有一种解决方案而不是将其保存在保存为变量的文件中?
我需要从协作者加载一组pickle数据.问题是,我似乎需要多阵列.我的代码如下:
f = open('data.p', 'rb')
a = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)
这是错误信息.
ImportError Traceback (most recent call last)
<ipython-input-3-17918c47ae2d> in <module>()
----> 1 a = pk.load(f)
/usr/lib/python2.7/pickle.pyc in load(file)
1382
1383 def load(file):
-> 1384 return Unpickler(file).load()
1385
1386 def loads(str):
/usr/lib/python2.7/pickle.pyc in load(self)
862 while 1:
863 key = read(1)
--> 864 dispatch[key](self)
865 except _Stop, stopinst:
866 return stopinst.value
/usr/lib/python2.7/pickle.pyc in load_global(self)
1094 module = self.readline()[:-1]
1095 name = self.readline()[:-1]
-> 1096 klass = self.find_class(module, name)
1097 self.append(klass)
1098 dispatch[GLOBAL] = …Run Code Online (Sandbox Code Playgroud) python ×11
pickle ×4
numpy ×2
arrays ×1
dictionary ×1
inequalities ×1
linux ×1
nested ×1
pathos ×1
pip ×1
pool ×1
python-2.7 ×1
python-3.x ×1
random ×1
setuptools ×1
sockets ×1
sympy ×1
zip ×1