我有一个60GB的SciPy数组(矩阵)我必须在5个以上的multiprocessing
Process
对象之间共享.我已经看过numpy-sharedmem并在SciPy列表上阅读了这个讨论.似乎有是两个approaches-- numpy-sharedmem
和使用multiprocessing.RawArray()
,并映射NumPy的dtype
s到ctype
秒.现在,numpy-sharedmem
似乎是要走的路,但我还没有看到一个很好的参考例子.我不需要任何类型的锁,因为数组(实际上是矩阵)将是只读的.现在,由于它的大小,我想避免副本.这听起来像是正确的方法是创建唯一的数组作为副本sharedmem
数组,然后将它传递给Process
对象?几个具体问题:
将sharedmem句柄实际传递给子的最佳方法是Process()
什么?我是否需要一个队列来传递一个阵列?管道会更好吗?我可以将它作为参数传递给Process()
子类的init(我假设它被腌制)吗?
在上面我讨论过的讨论中,有人提到numpy-sharedmem
不是64位安全吗?我肯定使用一些不是32位可寻址的结构.
这种RawArray()
方法是否存在权衡?更慢,更笨?
我是否需要numpy-sharedmem方法的任何ctype-to-dtype映射?
有没有人有一些OpenSource代码这样做的例子?我是一个非常亲力实践的人,如果没有任何好的例子,很难让它工作.
如果我可以提供任何其他信息以帮助其他人澄清这一点,请发表评论,我将添加.谢谢!
这需要在Ubuntu Linux和Maybe Mac OS上运行,但可移植性不是一个大问题.
我正在开发一个 Python C 扩展,我想公开一个完全在 C 中定义的自定义枚举(如:继承自 enum.Enum 的类)。
事实证明这不是一个微不足道的任务,并且继承使用的常规机制.tp_base
不起作用 - 很可能是由于 Enum 的元类没有被引入。
基本上我正在尝试这样做:
import enum
class FooBar(enum.Enum):
FOO = 1
BAR = 2
Run Code Online (Sandbox Code Playgroud)
在C.
经过大量深入研究 cpython 的内部结构后,这就是我想到的,包装在一个示例可构建模块中:
#include <Python.h>
PyDoc_STRVAR(module_doc,
"C extension module defining a class inheriting from enum.Enum.");
static PyModuleDef module_def = {
PyModuleDef_HEAD_INIT,
.m_name = "pycenum",
.m_doc = module_doc,
.m_size = -1,
};
struct enum_descr {
const char *name;
long value;
};
static const struct enum_descr foobar_descr[] = {
{
.name = "FOO",
.value = …
Run Code Online (Sandbox Code Playgroud) 我无法加载 xlsx 文件
import pandas
y=pandas.read_excel("as.xlsx",sheetname=0)
y
Run Code Online (Sandbox Code Playgroud)
这是错误信息
TypeError Traceback (most recent call last)
<ipython-input-5-54208838b8e5> in <module>
1 import pandas
----> 2 y=pandas.read_excel("as.xlsx",sheetname=0)
3 y
c:\users\lenovo-pc\appdata\local\programs\python\python37\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
206 else:
207 kwargs[new_arg_name] = new_arg_value
--> 208 return func(*args, **kwargs)
209
210 return wrapper
c:\users\lenovo-pc\appdata\local\programs\python\python37\lib\site-packages\pandas\io\excel\_base.py in read_excel(io, sheet_name, header, names, index_col, usecols, squeeze, dtype, engine, converters, true_values, false_values, skiprows, nrows, na_values, keep_default_na, verbose, parse_dates, date_parser, thousands, comment, skip_footer, skipfooter, convert_float, mangle_dupe_cols, **kwds)
304 if arg in kwds:
305 raise TypeError( …
Run Code Online (Sandbox Code Playgroud) 介绍性说明:尝试使用 Cython 加速 Python+Numpy 代码是一个常见问题,这个问题试图创建一个关于可以有效加速哪些类型的操作的规范问题。虽然我试图用一个具体的例子来说明,但这只是为了说明——请不要过多关注这个毫无意义的例子。
另外,我对 Cython 做出了足够的贡献,我应该声明一个从属关系(鉴于我正在提出这个主题)
实际问题
假设我有一个函数尝试对 Numpy 数组进行数值计算。它使用相当典型的操作:
np.sin
)。a-b
)import numpy as np
def some_func(a, b):
"""
a and b are 1D arrays
This is intended to be illustrative! Please don't focus on what it
actually does!
"""
transformed_a = np.zeros_like(a)
last = 0
for n in range(1, a.shape[0]):
an = a[n]
if an > 0:
delta = an - a[n-1]
transformed_a[n] = delta*last
else:
last …
Run Code Online (Sandbox Code Playgroud) 代码块 1 使用 __init__
%%cython -3
cdef class c:
cdef:
int a
str s
def __init__(self):
self.a=1
self.s="abc"
def get_vals(self):
return self.a,self.s
m=c()
print(m.get_vals())
Run Code Online (Sandbox Code Playgroud)
代码块 2 使用 __cinit__
%%cython -3
cdef class c:
cdef:
int a
str s
def __cinit__(self): # cinit here
self.a=1
self.s="abc"
def get_vals(self):
return self.a,self.s
m=c()
print(m.get_vals())
Run Code Online (Sandbox Code Playgroud)
我测试了这两个代码,并且都运行没有错误。在这种情况下,使用__cinit__
而不是有__init__
什么意义?
看了官方文章,被一句话搞糊涂了:
如果需要将修改后的参数列表传递给基类型,则必须在方法中执行相关部分的初始化
__init__()
,其中适用于调用继承方法的正常规则。
“修改后的论点”是什么意思?在这里,为什么我应该使用 init 而不是 cinit?
您好,我有一个接受以下参数的函数:
def calc(points: List[List[int]], x: int, y: int, unavail: List[int], N: int) -> (int, int):
pass
Run Code Online (Sandbox Code Playgroud)
我正在尝试在 Numba 中为其编写签名,但遇到了问题。下面的签名抛出异常。这有什么问题吗?
@jit('UniTuple(int64,2)(ListType[ListType[int64]],int64,int64,ListType[int64],int64)', nopython=True, nogil=True)
def calc(point, x, y, unavail, N):
pass
Run Code Online (Sandbox Code Playgroud)
例外:
类型错误:“_TypeMetaclass”对象不可下标
我有一些想要尽快运行的 Cython 代码。我是否需要释放 GIL 才能执行此操作?
假设我的代码与此类似:
import numpy as np
# trivial definition just for illustration!
cdef double some_complicated_function(double x) nogil:
return x
cdef void func(double[:] input) nogil:
cdef double[:] array = np.zeros_like(input)
for i in range(array.shape[0]):
array[i] = some_complicated_function(input[i])
Run Code Online (Sandbox Code Playgroud)
我从np.zeros_like
类似于以下内容的行中收到大量错误消息:
nogilcode.pyx:7:40: Calling gil-requiring function not allowed without gil
nogilcode.pyx:7:29: Accessing Python attribute not allowed without gil
nogilcode.pyx:7:27: Accessing Python global or builtin not allowed without gil
nogilcode.pyx:7:40: Constructing Python tuple not allowed without gil
nogilcode.pyx:7:41: Converting to …
Run Code Online (Sandbox Code Playgroud) 免责声明:我从Python Cookbook(O'Reilly)中获取了以下示例。
假设我有以下简单内容struct
:
typedef struct {
double x,y;
} Point;
Run Code Online (Sandbox Code Playgroud)
带有一个计算两个Point
s 之间的欧式距离的函数:
extern double distance(Point* p1, Point* p2);
Run Code Online (Sandbox Code Playgroud)
所有这些都是名为的共享库的一部分points
:
points.h
-头文件points.c
-源文件libpoints.so
-库文件(Cython扩展链接到该文件)我已经创建了包装的Python脚本(称为pypoints.py
):
#include "Python.h"
#include "points.h"
// Destructor for a Point instance
static void del_Point(PyObject* obj) {
// ...
}
// Constructor for a Point instance
static void py_Point(PyObject* obj) {
// ...
}
// Wrapper for the distance function
static PyObject* py_distance(PyObject* self, PyObject* …
Run Code Online (Sandbox Code Playgroud)