python cython c 性能对比
我们用以下方法计算百万以上float型数据的标准偏差,以估计各个方法的计算性能:
- 原始python
- numpy
- cython
- c(由cython调用)
python 原始方法:
# File: StdDev.py import math def pyStdDev(a):
mean = sum(a) / len(a)
return math.sqrt((sum(((x - mean)**2 for x in a)) / len(a)))
引入numpy对象:
# File: StdDev.py import numpy as np def npStdDev(a):
return np.std(a)
简单cython代码:
# File: cyStdDev.pyx import math def cyStdDev(a):
m = a.mean()
w = a - m
wSq = w**2
return math.sqrt(wSq.mean())
numpy优化后的cython:
# File: cyStdDev.pyx cdef extern from "math.h":
double sqrt(double m) from numpy cimport ndarray
cimport numpy as np
cimport cython @cython.boundscheck(False)
def cyOptStdDev(ndarray[np.float64_t, ndim=1] a not None):
cdef Py_ssize_t i
cdef Py_ssize_t n = a.shape[0]
cdef double m = 0.0
for i in range(n):
m += a[i]
m /= n
cdef double v = 0.0
for i in range(n):
v += (a[i] - m)**2
return sqrt(v / n)
最后cython调用”c”代码:
# File: cyStdDev.pyx cdef extern from "std_dev.h":
double std_dev(double *arr, size_t siz) def cStdDev(ndarray[np.float64_t, ndim=1] a not None):
return std_dev(<double*> a.data, a.size)
“c”代码定义在“std_dev.h”:
#include <stdlib.h>
double std_dev(double *arr, size_t siz);
在“std_dev.c”实现:
#include <math.h>
#include "std_dev.h"
double std_dev(double *arr, size_t siz) {
double mean = 0.0;
double sum_sq;
double *pVal;
double diff;
double ret;
pVal = arr;
for (size_t i = ; i < siz; ++i, ++pVal) {
mean += *pVal;
}
mean /= siz;
pVal = arr;
sum_sq = 0.0;
for (size_t i = ; i < siz; ++i, ++pVal) {
diff = *pVal - mean;
sum_sq += diff * diff;
}
return sqrt(sum_sq / siz);
}
分别测量其运行时间:
# Pure Python
python3 -m timeit -s "import StdDev; import numpy as np; a = [float(v) for v in range(1000000)]" "StdDev.pyStdDev(a)"
# Numpy
python3 -m timeit -s "import StdDev; import numpy as np; a = np.arange(1e6)" "StdDev.npStdDev(a)"
# Cython - naive
python3 -m timeit -s "import cyStdDev; import numpy as np; a = np.arange(1e6)" "cyStdDev.cyStdDev(a)"
# Optimised Cython
python3 -m timeit -s "import cyStdDev; import numpy as np; a = np.arange(1e6)" "cyStdDev.cyOptStdDev(a)"
# Cython calling C
python3 -m timeit -s "import cyStdDev; import numpy as np; a = np.arange(1e6)" "cyStdDev.cStdDev(a)"
结果:
| 方法 | 运行时间(ms) | python做基准 | numpy做基准 |
| python | 183 | 1倍 | 0.03倍 |
| numpy | 5.97 | 31 | 1 |
| cython | 7.76 | 24 | 0.8 |
| cython + numpy | 2.18 | 84 | 2.7 |
| 调用c | 2.22 | 82 | 2.7 |
总结:
- numpy优化速度很高,相比于python
- cython 在非优化状态下居然跟numpy性能差不多,优秀
- 直接手写c语言是性能很高的,但还是不如cython+numpy,大爷还是厉害
=============================================
qsy 23 may 2019
python cython c 性能对比的更多相关文章
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)
2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]
2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集. 上篇传送门: 2017年的golang.python.p ...
- Python开发【笔记】:从海量文件的目录中获取文件名--方法性能对比
Python获取文件名的方法性能对比 前言:平常在python中从文件夹中获取文件名的简单方法 os.system('ll /data/') 但是当文件夹中含有巨量文件时,这种方式完全是行不通 ...
- python性能对比
python性能对比之items #1 #-*- coding:utf8-*- import datetime road_nodes = {} for i in range(5000000): roa ...
- Python 读取图像文件的性能对比
Python 读取图像文件的性能对比 使用 Python 读取一个保存在本地硬盘上的视频文件,视频文件的编码方式是使用的原始的 RGBA 格式写入的,即无压缩的原始视频文件.最开始直接使用 Pytho ...
- 开发语言性能对比,C++、Java、Python、LUA、TCC
一直想做开发语言性能对比,刚好有时间都做了给大家参考一下, 编译类:C++和Java表现还不错 脚本类:TCC脚本动态运行C语言,性能比其他脚本快好多... 想玩TCC的同学下载测试包,TCC目录下修 ...
- python各种web框架对比
0 引言 python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- 【Python】常用排序算法的python实现和性能分析
作者:waterxi 原文链接 背景 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试题整 ...
随机推荐
- HttpClient到底该不该using?
HttpClient实例是否应该释放掉? 从源代码中可以的看到httpClient类最上层实现了IDisposable接口,看到该接口我们下意识就是要用using(自动释放)代码块包含起.或者自己手动 ...
- LoadRunner 11 的兼容问题及权限问题
1.LoadRunner 11 在服务器系统中可能出现 不兼容问题. 要对 安装目录bin\LRLauncherApp.exe 和 bin\wlrun.exe 右键属性兼容性(视系统定). 2.如果填 ...
- android版本对应表
API Level 最初Android版本 Linux内核版本 首次发布日期 后续Android版本 28 9 Unknown 2018-07-02(Beta 3) - 27 8.1 4.10 201 ...
- vue+element 根据内容计算单元格的宽度
需求是这样的,之前我也写过,就是前端渲染的表格数据是动态渲染表格的行和列, 那么就必然出现了一个问题,当列超过一定的个数的时候,会出现横向滚动条, 那么怎么让表格整体看起来自然协调一些呢,老大要求表格 ...
- Excel 使用VBA或宏----简单笔记
一.一种纯粹的录制宏.(未使用此方法,如有兴趣可自学),就是Excel提供了“所见即所得”的方式生成宏.把自己想要的操作记录,录制成宏. 自学网等各种网站有教学视频或文章 二.常用VBA语法及函数笔记 ...
- HTML5-表单 自带验证
表单语法<form method="post"(规定如何发送表单数据 常用值:get|post) action="result.html">(表示向 ...
- Nginx 高级配置-压缩功能
Nginx 高级配置-压缩功能 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx压缩相关参数概述 1>.gzip on | off; Nginx支持对指定类型的文 ...
- HFS ~ Http File Server
HFS ~ Http File Server官网:https://www.rejetto.com/hfs/ 官方下载地址:https://www.rejetto.com/hfs/hfs.exe
- 极简让ingress-nginx最新版(0.25.0)跑起来
裸步骤: 一,manadatory.yaml apiVersion: v1 kind: Namespace metadata: name: ingress-nginx labels: app.kube ...
- CodeForces 150E: Freezing with Style
题目传送门:CF150E. 据说这个傻逼题还有一个 \(\log\) 的做法,但是我还不会. 题意简述: 给定一棵 \(n\)(\(2\le n\le 10^5\))个点的树,边有边权. 定义一条路径 ...