cython并行性能-计算滚动求和 rolling function
cython通过编译为C程序提高性能有很多例子,通过OpenMP并行的性能没那么多。
今天尝试了一下似乎gcc对parallelism reduction优化的很厉害,加上OpenMP并行可以提高20倍性能(相对于pandas rolling),这不是简单的2 core带来的性能提高。
滚动求和 rolling sum的例子
最简单的实现pandas.rolling,通过操作numpy array,速度也还算能接受。
# test_para.py
import numpy as np
#import pyximport; pyximport.install(reload_support=True, setup_args={"include_dirs":np.get_include()})
import timeit
import pandas as pd
import para.cpara as cpara
X = -1 + 2*np.random.rand(100000)
ss = pd.Series(X)
ss.rolling(100).apply(np.sum,raw=True)
print('==============')
print('multi thread')
start_time = timeit.default_timer()
sum_cython=pd.Series(cpara.window_sum(X, 100))
print(timeit.default_timer() - start_time)
print('single thread')
start_time = timeit.default_timer()
sum_pandas=ss.rolling(100).apply(np.sum,raw=True)
print(timeit.default_timer() - start_time)
print(np.max(np.abs(sum_cython - sum_pandas)))
cython源文件
# cpara.pyx
cimport cython
import numpy as np
from cython.parallel import prange,parallel
cimport numpy as cnp
from libc.stdlib cimport malloc
@cython.boundscheck(False)
def window_sum(cnp.ndarray[double, ndim=1] arr, int window):
cdef h = np.zeros_like(arr)
cdef int imax = arr.shape[0]
cdef double *buffer = <double *>malloc(imax * sizeof(double))
cdef double result = 0.0
cdef int i, j
with nogil, parallel():
for i in prange(imax, schedule='dynamic'):
buffer[i] = 0.0
if i >= window-1:
for j in range(window):
buffer[i] += arr[i-j]
for i in range(imax):
if i < window -1:
h[i] = np.nan
else:
h[i] = buffer[i]
return h
setup.py中要加入openmp的编译链接参数
EXT = Extension("*",
["para/*.pyx"],
define_macros=[('CYTHON_TRACE', CYTHON_DEBUG),
('CYTHON_TRACE_NOGIL', CYTHON_DEBUG),
('CYTHON_BINDING', CYTHON_DEBUG),
("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION"),
('CYTHON_FAST_PYCCALL', '1')],
extra_compile_args = ["-fopenmp" ],
extra_link_args=['-fopenmp'],
include_dirs=[".", np.get_include()])
性能比较
%timeit pd.Series(cpara.window_sum(X, 100))
23.4 ms ± 325 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit ss.rolling(100).apply(np.sum,raw=True)
536 ms ± 3.96 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
536/23.4=22.9
测试环境:i3-7100U 2core 2T CPU, ubuntu 18.04 LTS
cython并行性能-计算滚动求和 rolling function的更多相关文章
- easyui生成合并行,合计计算价格
easyui生成合并行,合计计算价格 注:本文来源: 原创 一:图样你效果图 二:代码实现 1:datagrid 列展示: window.dataGrid = $("#dataGrid&qu ...
- python cython c 性能对比
我们用以下方法计算百万以上float型数据的标准偏差,以估计各个方法的计算性能: 原始python numpy cython c(由cython调用) python 原始方法: # File: Std ...
- ForkJoin、并行流计算、串行流计算对比
ForkJoin 什么是 ForkJoin ForkJoin 是一个把大任务拆分为多个小任务来分别计算的并行计算框架 ForkJoin 特点:工作窃取 这里面维护的都是双端队列,因此但其中一个线程完成 ...
- 横向tab计算滚动位置
React横向滚动计算 class Footer extends React.Component { handleClick(e) { const offset = 150; // 指定偏移量 thi ...
- .NET使用Task动态创建多任务多线程并行程序计算Redis集群keys计算
Task是一个很好用的多任务处理类,并且通过Task可以对任务进行很好的控制. 下面将通过代码实现Redis集群在使用IServer.keys时通过多任务对多个服务器示例进行并行计算,并对返回key做 ...
- js滚动
有选择性的重复造一些轮子,未必是件坏事.Aaron的博客上加了一个悬浮菜单,貌似显得很高大上了.虽然这类小把戏也不是头一次见了,但是从未自己写过.今天就选择性的拿这个功能写一写.下面是这个轮子的开发过 ...
- js的下拉刷新和上拉加载,基于iScroll v4.2.5
html部分 <div id="wrapper" style="height: 100%"> <div id="scroller&q ...
- 一个用于每一天JavaScript示例-使用缓存计算(memoization)为了提高应用程序性能
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- [转] Performance_js中计算网站性能监控利器
1.Performance方法 Performance提供的方法可以灵活使用,获取到页面加载等标记的耗时情况. performance.now() //返回当前到页面打开时刻的耗时,精确到千分之一毫秒 ...
- 开源图计算框架GraphLab介绍
GraphLab介绍 GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架.框架使用C++语言开发实现. 该框架是面向机器学习( ...
随机推荐
- 分布式事务 | 使用DTM 的Saga 模式
DTM 简介 前面章节提及的MassTransit.dotnetcore/CAP都提供了分布式事务的处理能力,但也仅局限于Saga和本地消息表模式的实现.那有没有一个独立的分布式事务解决方案,涵盖多种 ...
- 真正“搞”懂HTTP协议12之缓存代理
我们在前两篇的内容中分别学习了缓存和代理,大致了解了缓存有哪些头字段,代理是如何服务于服务器和客户端的,那么把两者结合起来,代理缓存,也就是说代理服务器也可以缓存,当客户端请求数据的时候,未必一定要追 ...
- VisionPro学习笔记(1)——软件介绍和基本使用
前言 自己使用visionPro已经有段时间了,最近也一直在研究其算子的理论,为了加深印象,计划将自己的学习笔记整理在博客园,当然其官方文档对如何使用及其各种算子都有详细的介绍,所以这里的笔记仅仅为个 ...
- 无法将“obj\Debug\net5.0\xxx.dll”复制到“bin\Debug\net5.0\xxx.dll”。超出了重试计数 10。失败。
解决办法 VS选中项目,右键清理解决方案,再次右键重新生成方案即可. 以上就是无法将"obj\Debug\net5.0\xxx.dll"复制到"bin\Debug\net ...
- 2021级《JAVA语言程序设计》上机考试试题
勉强写完了 Card package Bean; public class Card { private String CardId; private String CardData; private ...
- 2022年4月第十三届蓝桥杯省赛C组C语言 习题解析(每日一道)
本题总分:5 分[问题描述]小蓝要把一个字符串中的字母按其在字母表中的顺序排列.LANQIAO 排列后为 AAILNOQ.//用的冒泡排序 https://blog.csdn.net/superman ...
- [清华集训2016] Alice 和 Bob 又在玩游戏
\(\text{Solution}\) 第一道有向图 \(SG\) 函数的博弈论 有根树,设 \(f[x]\) 表示以 \(x\) 为根子树的 \(SG\) 值 对于分裂的图的 \(SG\) 值为每个 ...
- JZOJ 6800.NOIP2020.9.19模拟spongebob
题目大意 求形如 \[\sum_{i=1}^n |a_ix + b_i| \] 的最小值 思路 我们显然可以先把系数 \(a\) 提出来 于是就成了 \(\sum_{i=1}^n |a_i|·|x + ...
- Android:LitePal 在第一次创建表之后第二次创建新的表不生效
因为业务需求的增长,后续需要继续创建新的表,有可能代码没有任何报错,同时数据库也没有任何新的表加入进来. 修改 litepal.xml 的 version,如果之前是 1,那么修改为 2,总之比之前 ...
- 快捷方法1:csdn如何不登录复制代码
按F12,在console里执行下面两句代码 $("#content_views pre").css("user-select","text" ...