小编Dav*_*idW的帖子

在多处理过程之间共享大型只读Numpy数组

我有一个60GB的SciPy数组(矩阵)我必须在5个以上的multiprocessing Process对象之间共享.我已经看过numpy-sharedmem并在SciPy列表上阅读了这个讨论.似乎有是两个approaches-- numpy-sharedmem和使用multiprocessing.RawArray(),并映射NumPy的dtypes到ctype秒.现在,numpy-sharedmem似乎是要走的路,但我还没有看到一个很好的参考例子.我不需要任何类型的锁,因为数组(实际上是矩阵)将是只读的.现在,由于它的大小,我想避免副本.这听起来像是正确的方法是创建唯一的数组作为副本sharedmem数组,然后将它传递给Process对象?几个具体问题:

  1. 将sharedmem句柄实际传递给子的最佳方法是Process()什么?我是否需要一个队列来传递一个阵列?管道会更好吗?我可以将它作为参数传递给Process()子类的init(我假设它被腌制)吗?

  2. 在上面我讨论过的讨论中,有人提到numpy-sharedmem不是64位安全吗?我肯定使用一些不是32位可寻址的结构.

  3. 这种RawArray()方法是否存在权衡?更慢,更笨?

  4. 我是否需要numpy-sharedmem方法的任何ctype-to-dtype映射?

  5. 有没有人有一些OpenSource代码这样做的例子?我是一个非常亲力实践的人,如果没有任何好的例子,很难让它工作.

如果我可以提供任何其他信息以帮助其他人澄清这一点,请发表评论,我将添加.谢谢!

这需要在Ubuntu Linux和Maybe Mac OS上运行,但可移植性不是一个大问题.

python numpy shared-memory multiprocessing

79
推荐指数
4
解决办法
2万
查看次数

在 C 扩展中定义 Python 枚举 - 我这样做对吗?

我正在开发一个 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)

c python python-c-api python-3.x python-extensions

14
推荐指数
1
解决办法
638
查看次数

pandas.read_excel 的类型错误

我无法加载 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)

python pandas

12
推荐指数
1
解决办法
3万
查看次数

我可以使用 Cython 加速 Numpy 密集型函数的哪些部分

介绍性说明:尝试使用 Cython 加速 Python+Numpy 代码是一个常见问题,这个问题试图创建一个关于可以有效加速哪些类型的操作的规范问题。虽然我试图用一个具体的例子来说明,但这只是为了说明——请不要过多关注这个毫无意义的例子。

另外,我对 Cython 做出了足够的贡献,我应该声明一个从属关系(鉴于我正在提出这个主题)


实际问题

假设我有一个函数尝试对 Numpy 数组进行数值计算。它使用相当典型的操作:

  • 对不易矢量化的数组元素进行循环
  • 调用 Numpy/Scipy 函数(在本例中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)

python numpy cython

10
推荐指数
1
解决办法
729
查看次数

在 Cython 类中,使用 __init__ 和 __cinit__ 有什么区别?

代码块 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)
  1. 我测试了这两个代码,并且都运行没有错误。在这种情况下,使用__cinit__而不是有__init__什么意义?

  2. 看了官方文章,被一句话搞糊涂了:

    如果需要将修改后的参数列表传递给基类型,则必须在方法中执行相关部分的初始化__init__(),其中适用于调用继承方法的正常规则。

“修改后的论点”是什么意思?在这里,为什么我应该使用 init 而不是 cinit?

python oop class cython

5
推荐指数
1
解决办法
1064
查看次数

Numba 函数签名 - 如果是整数则接受列表列表

您好,我有一个接受以下参数的函数:

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”对象不可下标

python jit numba

5
推荐指数
0
解决办法
314
查看次数

我需要在 Cython 中使用 `nogil`

我有一些想要尽快运行的 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 cython gil

4
推荐指数
1
解决办法
988
查看次数

编写Cython扩展:如何从Python访问C结构内部数据?

免责声明:我从Python Cookbook(O'Reilly)中获取了以下示例。

假设我有以下简单内容struct

typedef struct {
  double x,y;
} Point;
Run Code Online (Sandbox Code Playgroud)

带有一个计算两个Points 之间的欧式距离的函数:

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)

c python struct wrapper cython

0
推荐指数
1
解决办法
994
查看次数