首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在CythonvsBoost.Python中扩展NumPy的相对优势是什么?

在CythonvsBoost.Python中扩展NumPy的相对优势是什么?
EN

Stack Overflow用户
提问于 2017-01-23 11:07:00
回答 2查看 2.7K关注 0票数 7

我需要加速处理NumPy数组的一些算法。他们将使用std::vector和一些更先进的STL数据结构。

我将选择范围缩小到Cython (现在封装了大多数STL容器)和Boost.Python (现在已经内置了对NumPy的支持)。

从我作为一名程序员的经验中我知道,有时需要花几个月的时间才能发现其隐藏的问题(因为这些问题很少被它的门徒用作谈话要点),所以您的帮助可能会节省我很多时间。

在CythonvsBoost.Python中扩展NumPy的相对优势和缺点是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-23 13:23:11

这是一个非常不完整的答案,它实际上只涵盖了其中的几个小部分(如果我想到更多的内容,我会编辑它):

促进 specifically for numpy arrays。这意味着operator[]将来自ndarray继承的基类object类,这意味着调用将通过ndarray机制传递到__getitem__,因此索引速度将很慢(接近ndarray的速度)。如果你想以最快的速度进行索引,你必须自己做指针算法:

代码语言:javascript
运行
AI代码解释
复制
// rough gist - untested:

// i,j,k are your indices

double* data = reinterpret_cast<double*>(array.get_data());
// in reality you'd check the dtype - the data may not be a double...

double data_element = array.strides(0)*i + array.strides(1)*j +array.strides(2)*k;

相比之下,Cython对自动内置的numpy数组进行了高效的索引。

Cython在像std::vector这样的事情上并不擅长(尽管它并不是绝对糟糕的--你通常可以骗它去做你想做的事情)。一个值得注意的限制是,所有cdef都必须在函数开始时使用,以便在那里构造默认的C++类,然后再分配给/处理(这可能有点低效)。对于除了简单使用之外的任何事情,您都不希望在Cython中操作C++类型(相反,最好用C++编写代码,然后从Cython调用它)。

第二个限制是它难以处理非类模板。一个常见的例子是std::array,它有一个数字模板。根据您计划的代码,这可能是一个问题,也可能不是一个问题。

票数 7
EN

Stack Overflow用户

发布于 2017-01-23 12:57:09

对于小的一个问题,我倾向于喜欢cython,对于与c++代码库的更大集成,我更喜欢boost Python。

在某种程度上,这取决于您的代码的受众。如果您正在与一个在python方面有丰富经验但很少使用C++的团队一起工作,Cython是有意义的。如果您有一个固定的代码库,可以使用复杂的类型进行互操作,那么boost python的运行成本可能会更低一些。

Cython鼓励您以增量方式编写,根据需要逐步添加类型以获得额外的性能,并解决许多硬打包问题。boost Python需要在构建设置方面付出很大的努力,并且很难生成在PyPI上有意义的包。

Cython内置了很好的错误消息/诊断,但据我所见,boost产生的错误很难解释--对自己好一点,并使用一个新的ish c++编译器,最好是以生成可读的错误消息而闻名。

不要低估像numba这样的替代工具(与cython类似的代码是Python,而不仅仅是类似的东西)和pybind11 (boost Python和更好的错误消息)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41813799

复制
相关文章
在 Ubuntu 中 安装python
virtualenvwrapper: 基于 virtualenv 之上的一个工具,通过它可以方便的创建/激活/管理/销毁虚拟环境,没它的话进行上面的操作将会相当麻烦。
py3study
2020/01/09
2.4K0
在Linux/CentOS中编译安装Python
心血来潮,想学习一下Python,听说用来做爬虫还不错。先从运行环境开始入手,CentOS中已经内置了Python,但版本似乎比较老,通过python -V命令看到版本是2.4.3。目前Python 2.x的最新版本号是2.7.8,那么就开始动手升级一下。
魏杰
2022/12/23
7390
在docker中解决软件动态库问题 & 安装opencv_python
本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/docker/dynamic_lib_in_docker_opencv/
羽翰尘
2019/11/20
2.4K0
在 python3.x中安装 Crypt
1.0 安装: 直接找过来 whl 安装:https://pan.baidu.com/s/1ZYQp4Knwk-Bcr9hmx9IPyA pip安装:pip install pycrypto-2.6.1-cp36-cp36m-win_amd64.whl
py3study
2020/01/20
1.5K0
在VMware环境安装Ubuntu Server中遇到的无法安装问题
我们项目最近在测试pihole dns, 所以想要安装Ubuntu Server测试,结果发现报错。
繁华是客
2023/03/03
4.9K0
在Mac OS系统中安装Python教程
在进入工作岗位之后会有很多公司为开发人员提供Mac OS系统的电脑,所以这篇文章帮大家下载安装一下Mac OS系统下的python开发环境。
python自学网
2021/11/28
1.7K0
在Mac OS系统中安装Python教程
在docker中安装python依赖库/模块
我们一般如何处理软件的运行环境问题?一般上,即使用docker,我们的python脚本还是不可避免地需要安装额外的库。而每添加一个库都制作一个新的docker,这会是一个灾难。有必要寻找一种更优雅的解决方案。
羽翰尘
2019/11/20
12.3K0
在CentOS7中安装python3.7
下载python3.7.0的安装包至/usr/local/src/目录,切换至/usr/local/src/目录:
py3study
2020/01/10
9930
在Python中处理CSV文件的常见问题
当谈到数据处理和分析时,CSV(Comma-Separated Values)文件是一种非常常见的数据格式。它简单易懂,可以被绝大多数编程语言和工具轻松处理。在Python中,我们可以使用各种库和技巧来处理CSV文件,让我们一起来了解一些常见问题和技巧吧!
华科云商小孙
2023/09/25
6300
在全新的Ubuntu中安装Python3 环境
在全新的Ubuntu 18.04中已经自带了Python 3。但是这个Python环境并不完整,需要补充安装下面几个模块。
青南
2018/10/18
1.1K0
怎么在python中安装matplotlib_matplotlib依赖库
2.虽然下载Python的时候自带有pip,但这里更新一下pip,输入更新pip命令:
全栈程序员站长
2022/09/27
1.8K0
怎么在python中安装matplotlib_matplotlib依赖库
node-sass 在 jenkins 中因为权限无法安装的问题
我使用 whoami 输出执行命令的用户是 root,但是 node 执行安装node-sass时调用了 mkdir 以及调用 binding.node 没有权限。然后试了一下使用 sudo 来执行 rebuild node-sass ,就成功了。这是我的日志:
前Thoughtworks-杨焱
2022/02/19
2.5K0
在VirtualBox中安装ArchLinux
乐百川
2018/01/09
3K0
在Linux中安装JDK
JDK安装包 下载地址:http://www.oracle.com/technetwork/java/javase/archive-139210.html
CoderJed
2018/09/13
5.2K0
在docker中安装phpmyadmin
其中,PMA_HOST和PMA_PORT填写的内容是MySQL数据库的地址和端口号
灯珑LoGin
2022/10/31
2.1K0
在vmware中安装Android
首先可以前往https://osdn.net/projects/android-x86/下载自己喜欢的镜像,这里以安卓9的镜像为例
阿龙w
2022/12/25
2.8K0
在vmware中安装Android
在Anaconda中安装OpenCV
本人使用的是win10系统,anaconda版本为4.7.12,python版本为3.7.4
全栈程序员站长
2022/07/22
2K0
在Anaconda中安装OpenCV
在 CentOS 中安装 MySQL
安装 MySQL 8.0 时,会自动为 root 用户生成一个临时密码,并记录在日志文件里。请使用以下命令查看 root 用户的临时密码:
不惑
2023/09/23
3.2K0
在ArchLinux中安装MySql
最近在用ArchLinux在虚拟机里学习Linux。现在想在ArchLinux中安装WordPress,首先就需要安装MySql数据库。但是在MySql被Oracle收购之后,很多开源支持者就转而使用MariaDb了。不过MariaDb也和MySql兼容的,所以基本不用有什么担心。由于ArchLinux只带了MariaDb,所以我们就用MariaDb来代替MySql。
乐百川
2022/05/05
1.5K0
在Ubuntu中安装Hadoop
在装Hadoop之前首先需要:  1.java1.6.x 最好是sun的,1.5.x也可以  2.ssh 安装ssh $ sudo apt-get install ssh $ sudo apt-get install rsync 下载Hadoop  从http://Hadoop.apache.org/core/releases.html 下载最近发布的版本  最好为Hadoop创建一个用户:  比如创建一个group为Hadoop user为Hadoop的用户以及组 $ sudo addgroup Ha
闵开慧
2018/03/30
1.5K0

相似问题

在Python中安装netfilterque的问题

18

在Python中安装matplotlib的问题

43

在Linux / CentOS中安装Python的问题

23

在Python中安装TabNet的问题(Anaconda)

10

在GCP中安装python需求的问题

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档