我的问题:我发现使用原始C++使用STL映射和向量处理大型数据集通常可以比使用Cython更快(并且内存占用更少).
我认为这部分速度惩罚是由于使用Python列表和dicts,并且可能有一些技巧在Cython中使用较少的数据结构.例如,这个页面(http://wiki.cython.org/tutorials/numpy)展示了如何通过预定义ND数组的大小和类型,在Cython中非常快速地生成numpy数组.
问题:有没有办法用list/dicts做类似的事情,例如通过大致说明你希望在它们中有多少元素或(键,值)对?也就是说,在Cython中是否存在将列表/ dicts转换为(快速)数据结构的惯用方法?
如果不是,我想我只需要用C++编写它并包装在Cython导入中.
我正在将Cython内存视图转换为numpy数组(以便能够在纯Python代码中使用它):
from libc.stdlib cimport realloc
cimport numpy as np
DTYPE = np.float64
ctypedef np.float64_t DTYPE_t
cpdef np.ndarray[DTYPE_t] compute(DTYPE_t[:,::1] data):
cdef unsigned int Nchannels = data.shape[0]
cdef unsigned int Ndata = data.shape[1]
cdef DTYPE_t* output = NULL
cdef DTYPE_t[::1] mv
output = <DTYPE_t*>realloc(output, Ndata*sizeof(output))
if not output:
raise MemoryError()
mv = <DTYPE_t[:Ndata]>output
mv[10:Ndata-10] = 0.0
# various calculations...
return np.asarray(mv, dtype=DTYPE, order='C')
Run Code Online (Sandbox Code Playgroud)
它编译,但编译器给出以下警告:
/Users/vlad/anaconda/lib/python2.7/site-packages/numpy/core/include
/nump/npy_1_7_deprecated_api.h:15:2: warning:
"Using deprecated NumPy API, disable it by #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings]
Run Code Online (Sandbox Code Playgroud)
我在setup.py中添加了建议的指令:
from distutils.core import …Run Code Online (Sandbox Code Playgroud) 我正在尝试C使用我的python应用程序集成第三方库Cython.我有为测试编写的所有python代码.我找不到设置它的例子.
我有一个pyd/pyx手动创建的文件.第三方给了我一个header file (*.h)和一个shared library (*.so).据我所知,没有其他依赖.有人可以提供一个如何使用Cython和设置此示例的示例disutils吗?
谢谢
是否有可能优化使用Cython在Django中开发的关键任务应用程序的速度?
最近我在互联网上看到,Cython可以将Python代码转换为C类似速度.Django有可能吗?
这是这个问题的后续行动.
(为什么/何时)是否更适合Py_ssize_t用于索引?在我刚发现的文档中
Run Code Online (Sandbox Code Playgroud)# Purists could use "Py_ssize_t" which is the proper Python type for # array indices.
- >这是否始终指的是索引NumPy/Cython - 数组/ - 应该使用的视图Py_ssize_t?
- >是Py_ssize_t例如一个unsigned int,这样我可以不使用@cython.boundscheck(False)
我正在尝试从大型C++共享库(libbig.so)中获取一些函数,并通过Cython将它们暴露给Python.为此,我有一个小的C++文件(small.cpp),它提供了我需要的共享库功能的薄包装,以便通过Cython(pysmall.pyx)调用它.
libbig.so - > small.cpp,small.h - > libsmall.so - > pysmall.pyx - > pysmall.cpp - > pysmall.so
我可以在自己的计算机上构建和运行这个扩展模块:我只是将small.cpp编译成libsmall.so,然后在setup.py的Extension对象中说"libraries = ['small']"来构建扩展模块pysmall .所以.
我现在正在尝试分发此扩展模块,并且我很难跟踪描述用于分发Cython模块以及C源代码和共享库的setup.py最佳实践的资源.我已经阅读了" 安装Python模块 "," 分发Python模块 "和" 分发Cython模块 ".我了解如何自行分发扩展模块.我不太确定分发扩展模块的依赖关系的最佳方式.
Cython文档表明您应该包含生成的.cpp文件以及.pyx文件,以防Cython不存在,但它不提供代码来演示如何最好地处理每种情况.它也没有提到如何分发Cython模块所依赖的共享库.
我正在挖掘来自pandas,lxml,pyzmq,h5py等的setup.py脚本,并且发生了相当多的无关紧要的工作.如果有人有指针或示例代码可能会加速这个过程,我当然感激不尽!
我正在尝试找到一种有效的方法,将包含整数点的数据行组合在一起,并将它们存储为Python对象.该数据是由X和Y坐标点,表示为逗号分隔的字符串.这些点必须配对,如(x_1, y_1), (x_2, y_2), ...等,然后存储为对象列表,其中每个点都是一个对象.下面的函数get_data生成此示例数据:
def get_data(N=100000, M=10):
import random
data = []
for n in range(N):
pair = [[str(random.randint(1, 10)) for x in range(M)],
[str(random.randint(1, 10)) for x in range(M)]]
row = [",".join(pair[0]),
",".join(pair[1])]
data.append(row)
return data
Run Code Online (Sandbox Code Playgroud)
我现在的解析代码是:
class Point:
def __init__(self, a, b):
self.a = a
self.b = b
def test():
import time
data = get_data()
all_point_sets = []
time_start = time.time()
for row in data:
point_set = []
first_points, …Run Code Online (Sandbox Code Playgroud) 我拼命想把一个std::vector<bool>类成员公开给Python类.
这是我的C++类:
class Test
{
public:
std::vector<bool> test_fail;
std::vector<double> test_ok;
};
Run Code Online (Sandbox Code Playgroud)
虽然test_ok类型double(或int,float,..)的访问和转换有效,但它不适合bool!
这是我的Cython类:
cdef class pyTest:
cdef Test* thisptr
cdef public vector[bool] test_fail
cdef public vector[double] test_ok
cdef __cinit__(self):
self.thisptr = new Test()
self.test_fail = self.thisptr.test_fail # compiles and works if commented
self.test_ok = self.thisptr.test_ok
cdef __dealloc__(self):
del self.thisptr
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from *:
ctypedef bool X 'bool'
^
------------------------------------------------------------
vector.from_py:37:13: 'bool' is not a type …Run Code Online (Sandbox Code Playgroud) 编辑:我强调了这个问题,因为它可能太复杂了.问题的内容在下面以粗体显示.
我想更多地了解使用时实际创建的对象DataFrame.rolling或Series.rolling:
print(type(df.rolling))
<class 'pandas.core.window.Rolling'>
Run Code Online (Sandbox Code Playgroud)
一些背景:考虑常用的替代品np.as_strided.此代码段本身并不重要,但其结果是我在提出此问题时的参考点.
def rwindows(a, window):
if a.ndim == 1:
a = a.reshape(-1, 1)
shape = a.shape[0] - window + 1, window, a.shape[-1]
strides = (a.strides[0],) + a.strides
windows = np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
return np.squeeze(windows)
Run Code Online (Sandbox Code Playgroud)
这rwindows将采用1d或2d ndarray并构建等于指定窗口大小的滚动"块"(如下所示). 对象如何与下面.rolling的ndarray输出进行比较? 它是一个迭代器,是否为每个块存储了某些属性?或完全不同的东西?我已经尝试使用属性/方法(例如__dict__和)在对象上使用制表符完成,_get_index()并且它们并没有告诉我太多.我也在_create_blocks熊猫中看到过一种方法 - 它是否与该strided方法类似?
# as_strided version
a = np.arange(5)
print(rwindows(a, 3)) # 1d input
[[0 1 …Run Code Online (Sandbox Code Playgroud) 我有庞大的Python模块(+8000行).它们通过读写硬件寄存器,通过串口与硬件平台交互,基本上有很多功能.
它们不是数值算法.因此,应用程序只是读/写硬件寄存器/内存.我使用这些库来编写自定义脚本.最后,我需要将所有这些东西移动到我的硬件上的嵌入式处理器中运行以获得更好的控制,然后我只是从PC启动事件,其余的是硬件.
所以我需要将它们转换为C.如果我可以通过自动工具将我的脚本转换为C,这将为我节省大量时间.这就是我被Cython吸引的原因.效率并不重要我的代码不是数字计算器.但生成的代码应该相对较小,以适应我有限的内存(几百千字节).
我可以使用Cython作为C的自定义Python脚本的转换器吗?我的猜测是肯定的,在这种情况下我可以使用这些.c文件在我的硬件中运行吗?我的猜测不是因为我必须在我的硬件中使用Cython以便它们运行.但是如果只是创建一些.c文件,我可以通过它独立完成,因为代码没有使用Python的许多功能,它只是将它用作快速实现脚本.
cython ×10
python ×10
c ×3
numpy ×3
c++ ×2
distutils ×2
algorithm ×1
dataframe ×1
django ×1
indexing ×1
linker ×1
memoryview ×1
optimization ×1
pandas ×1
performance ×1