Python中的解释与动态调度惩罚
我看着布兰登·罗德斯(Brandon Rhodes)谈论凯森(Cython) - " exe的日子在我们到了". 布兰登在09:30提到,对于特定的简短代码,跳过解释给出了40%的加速,而跳过分配和调度给出了574%的加速(10:10). 我的问题是 - 如何用于特定代码?是否需要手动提取基础C命令,然后以某种方式使运行时运行它们? 这是一个非常有趣的观察结果,但是如何重新创建实验? 解决方案 让我们看一下这个python函数: def py_fun(i,N,step): res=0.0 while i
0 2023-05-24
编程技术问答社区
threadpoolexecutor与cython's nogil的结合使用
我已经阅读了这个问题和答案 - cython nogil 我也有类似的问题,尽管我的系统具有多个内核,但我的Cython代码没有得到预期的加速.我在Ubuntu 18.04实例上有4个物理核%.我正在对C ++类中的数据结构进行查找,该数据结构不会被修改,即我只通过Cython对C ++数据结构进行仅阅读查询. C ++侧没有任何静音锁. 这是我对GIL的第一次经历,我想知道我是否错误地使用了它.同样,时间的输出有点令人困惑,因为我认为它没有正确地介绍每个工作人员线程所需的实际时间. 我似乎错过了一些关键的东西,但是我无法弄清楚它是什么,因为我几乎使用了与链接的So答案相同的模板来使用GIL. import psutil import numpy as np from concurrent.futures import ThreadPoolExecutor from functools import partial cdef extern from "Recta
0 2023-05-24
编程技术问答社区
有效地计算平方差之和
这是提取两个图像的RGB值的循环,并计算所有三个通道中平方差的总和. 直接在我的主机上运行此代码.Py需要0.07秒.如果我在此.Pyx文件中运行它,则速度将降低到1秒.我已经阅读了有关CDEF功能的信息,但是当时我没有成功.将此功能转换为CDEF函数的任何帮助将不胜感激.我真的需要这个循环尽可能快地走. from cpython cimport array import array import numpy as np cimport numpy as np def fittnes(Orginal, Mutated): Fittnes = 0 for x in range(0, 299): for y in range(0, 299): DeltaRed = (Orginal[x][y][0] - Mutated[x][y][0]) DeltaGreen = (Orginal[x][y]
0 2023-05-24
编程技术问答社区
Numpy数组乘法行为从纯Python到Cython不同
在纯净的python代码中: 案例A: retimg = np.zeros((dstH, dstW, 3), dtype=np.uint8) A = img[x % (scrH - 1), y % (scrW - 1)] B = img[x % (scrH - 1), y1 % (scrW - 1)] C = img[x1 % (scrH - 1), y % (scrW - 1)] D = img[x1 % (scrH - 1), y1 % (scrW - 1)] retimg[i, j] = A * (1 - mu) * (1 - nu) + B * mu * (1 - nu) + C * (1 - mu) * nu + D * mu * nu 案例B: retimg = np.zeros((dstH, dstW, 3), dtype=np.uint8) A = img[x % (scrH - 1), y % (scrW - 1)] B = img[x % (sc
0 2023-05-24
编程技术问答社区
在一个dict中更新多个键值对的性能
我目前正在Python中的建模环境,该环境使用DICT共享连接零件的连接属性.我目前这样做的方式大约需要我的总计划运行时间的15-20%,这很大程度上有几百万个迭代... 所以我发现自己正在寻找如何加快更新dict中的多个值并从dicts中获得多个值的速度. 我的示例dict看起来像这样(预计键值对数的数量将留在300至1000的当前范围内,因此我将其填充到此数量中): val_dict = {'a': 5.0, 'b': 18.8, 'c': -55/2} for i in range(200): val_dict[str(i)] = i val_dict[i] = i**2 keys = ('b', 123, '89', 'c') new_values = np.arange(10, 41, 10) length = new_values.shape[0] keys和new_values的形状和val_dict中的键值对数始终是恒定的, new_v
0 2023-05-24
编程技术问答社区
sparse_hash_map对于特定的数据来说是非常慢的。
tl; dr:为什么sparse_hash_map中的键查找对于特定数据慢50倍? 我正在使用我编写的非常简单的Cython包装器来测试Google的Sparsehash库中sparse_hash_map 关键查找的速度. Hashtable包含uint32_t键和uint16_t值.对于随机键,值和查询,我获得了超过1M的查找/秒.但是,对于特定数据,我需要的性能几乎不超过20K查找/秒 包装器是在这里.慢慢运行的表是 benchmark.pyx: from sparsehash cimport SparseHashMap from libc.stdint cimport uint32_t from libcpp.vector cimport vector import time import numpy as np def fill_randomly(m, size): keys = np.random.random_integers(0, 0xFFFFF
0 2023-05-24
编程技术问答社区
使用Cython和替换列表来优化简单的CPU绑定的循环
我正在尝试评估一些方法,并且我正在以性能击中绊脚石. 为什么我的Cython代码这么慢?我的期望是,该代码的运行速度会更快(也许只有256 ** 2个条目的2D循环的纳米秒)而不是毫秒. 这是我的测试结果: $ python setup.py build_ext --inplace; python test.py running build_ext counter: 0.00236220359802 sec pycounter: 0.00323309898376 sec percentage: 73.1 % 我的初始代码看起来像这样: #!/usr/bin/env python # encoding: utf-8 # filename: loop_testing.py def generate_coords(dim, length): """Generates a list of coordinates fr
0 2023-05-23
编程技术问答社区
如何提高numpy代码的速度
我有以下代码.原则上,它需要2^6 * 1000 = 64000迭代,这是很少的.但是,我的计算机上需要9秒,我想至少以n = 15进行运行. from __future__ import division import numpy as np import itertools n=6 iters = 1000 firstzero = 0 bothzero = 0 for S in itertools.product([-1,1], repeat = n+1): for i in xrange(iters): F = np.random.choice(np.array([-1,0,0,1], dtype=np.int8), size = n) while np.all(F ==0): F = np.random.choice(np.array([-1,0,0,1], dtype=np.int8), size = n)
2 2023-05-23
编程技术问答社区
Cython:为什么size_t比int快?
将某些Cython变量从类型int更改为size_t类型可以显着减少某些功能时间(〜30%),但我不明白为什么. 例如: cimport numpy as cnp import numpy as np def sum_int(cnp.int64_t[::1] A): cdef unsigned long s = 0 cdef int k for k in xrange(A.shape[0]): s += A[k] return s def sum_size_t(cnp.int64_t[::1] A): cdef unsigned long s = 0 cdef size_t k for k in xrange(A.shape[0]): s += A[k] return s a = np.array(range(1000000)) 和计时结果: In [17]: %t
0 2023-05-23
编程技术问答社区
在python中用cython对小数组进行高效的数学运算
我在大数组上使用numPexpr进行快速数学,但是如果数组的大小小于CPU缓存,则使用简单数组数学在Cython中编写我的代码更快,尤其是如果该功能多次称为功能. 问题是,您如何与Cython的阵列一起工作,或更明确:是否有直接接口Python的阵列.Cython中的Array类型?我想做的就是这样的事情(简单示例) cpdef array[double] running_sum(array[double] arr): cdef int i cdef int n = len(arr) cdef array[double] out = new_array_zeros(1.0, n) ... # some error checks out[0] = arr[0] for i in xrange(1,n-1): out[i] = out[i-1] + arr[i] return(out) 我首先尝试使用
0 2023-05-23
编程技术问答社区
优化Cython中的字符串
我正在尝试向我们的小组展示Cython增强Python表现的优点.我显示了几个基准,所有这些都达到了速度: 编译现有的Python代码. 使用CDEF与静态类型变量,特别是在内部循环中. 但是,我们的大部分代码都进行了字符串操纵,我无法通过键入Python字符串来提出优化代码的典范. 我尝试过的一个例子是: cdef str a cdef int i,j for j in range(1000000): a = str([chr(i) for i in range(127)]) ,但将" A"作为字符串键入实际上使代码运行较慢.我已经阅读了有关" Unicode和通过字符串"的文档,但是对我所显示的情况的适用方式感到困惑.我们不使用Unicode-一切都是纯粹的ASCII.我们正在使用Python 2.7.2 任何建议都将不胜感激. 解决方案 我建议您在cpython.array.array s上进行操作.最好的文档是C API和Cyth
0 2023-05-23
编程技术问答社区
Numba代码比纯Python慢
我一直在努力加快粒子滤清器的重采样计算.由于Python有很多方法可以加快速度,但我会尝试所有这些.不幸的是,Numba版本非常慢.由于numba应该导致加快速度,我认为这是我的错误. 我尝试了4种不同的版本: numba python numpy Cython 每个代码如下: import numpy as np import scipy as sp import numba as nb from cython_resample import cython_resample @nb.autojit def numba_resample(qs, xs, rands): n = qs.shape[0] lookup = np.cumsum(qs) results = np.empty(n) for j in range(n): for i in range(n): if rands[j
4 2023-05-23
编程技术问答社区
在有数百万行的pandas数据框架中,以最快的方式比较行和前行
我正在寻找解决方案来加快我编写的函数以通过pandas dataframe循环并比较当前行和上一行之间的列值. . 作为一个例子,这是我问题的简化版本: User Time Col1 newcol1 newcol2 newcol3 newcol4 0 1 6 [cat, dog, goat] 0 0 0 0 1 1 6 [cat, sheep] 0 0 0 0 2 1 12 [sheep, goat] 0 0 0 0 3 2 3 [cat, lion] 0 0 0 0 4 2 5
2 2023-05-23
编程技术问答社区
如何加快Pandas多级数据框架的求和速度?
我正在尝试加快多个大型多级数据范围的总和. 这是一个样本: df1 = mul_df(5000,30,400) # mul_df to create a big multilevel dataframe #let df2, df3, df4 = df1, df1, df1 to minimize the memory usage, #they can also be mul_df(5000,30,400) df2, df3, df4 = df1, df1, df1 In [12]: timeit df1+df2+df3+df4 1 loops, best of 3: 993 ms per loop 我对993ms不满意,有什么方法可以加快加速吗? Cython可以提高性能吗?如果是,如何编写Cython代码?谢谢. 注意: mul_df()是创建演示多级数据框的功能. import itertools import numpy as np import
0 2023-05-23
编程技术问答社区
在cython中生成高斯随机数的最有效和可移植的方法是什么?
我正在编写一个Cython应用程序,我需要在紧密的嵌套环中直接生成高斯随机变量.我想在不引入任何额外的依赖项(例如GSL上)这样做. 对于我当前能够使用统一的随机数数字进行的方式的最小版本: : from libc.stdlib cimport rand, RAND_MAX import numpy as np cdef double random_uniform(): cdef double r = rand() return r/RAND_MAX def my_function(int n): cdef int i cdef double[:] result = np.zeros(n, dtype='f8', order='C') for i in range(n): result[i] = random_uniform() return result 上面的代码在功能上等效于numpy.rando
2 2023-05-23
编程技术问答社区
np.vstack、np.append、np.concatenate和用cython手工制作的函数哪个更快?
我编码了一些程序,该程序在每次迭代中更新numpy列表,并在其中进行一些操作.迭代的数量取决于时间.例如,在1秒内可能会有1000至2500迭代.这意味着numpy列表中的项目在1秒内不超过2500. 我实现了一种基本算法,我不确定这是计算bonus的最快方法: import numpy as np cdef int[:, :] pl_list cdef list pl_length cdef list bonus pl_list = np.array([[8, 7]], dtype=np.int32) def modify(pl_list, pl_length): cdef int k_const = 10 mean = np.mean(pl_list, axis=0) mean = np.subtract(mean, pl_length) dev = np.std(pl_list, axis=0) mean[0] / dev[0
0 2023-05-23
编程技术问答社区
用Numpy和Cython加速距离矩阵的计算
考虑一个尺寸nxm的numpy阵列a.目的是计算欧几里得距离矩阵D,其中每个元素d [i,j]是i和j行之间的欧克里达人距离.最快的方法是什么?这并不是我需要解决的问题,但这是我想做的事情的一个很好的例子(通常可以使用其他距离指标). 这是我到目前为止可能提出的最快的: n = A.shape[0] D = np.empty((n,n)) for i in range(n): D[i] = np.sqrt(np.square(A-A[i]).sum(1)) 但这是最快的方式吗?我主要关心循环.我们可以用Cython击败它吗? 为了避免循环,我尝试使用广播,然后做类似的事情: D = np.sqrt(np.square(A[np.newaxis,:,:]-A[:,np.newaxis,:]).sum(2)) ,但事实证明这是一个坏主意,因为构造中有一些开销,一个中间的3D尺寸nxnxm阵列,因此性能更糟. 我尝试了Cython.但是我是Cyth
0 2023-05-23
编程技术问答社区
在Cython中创建小型数组需要大量的时间
我正在编写一个新的随机数生成器,用于numpy,当我遇到这种非常奇怪的行为时,它会根据任意分布产生随机数: 这是test.pyx #cython: boundscheck=False #cython: wraparound=False import numpy as np cimport numpy as np cimport cython def BareBones(np.ndarray[double, ndim=1] a,np.ndarray[double, ndim=1] u,r): return u def UntypedWithLoop(a,u,r): cdef int i,j=0 for i in range(u.shape[0]): j+=i return u,j def BSReplacement(np.ndarray[double, ndim=1] a, np.ndarray[double, ndim=1
0 2023-05-23
编程技术问答社区
有条件地创建一个pandas列的最快速方法
在PANDAS DataFrame中,我想根据另一列的值有条件地创建一个新列.在我的应用程序中,数据帧通常有几百万行,并且在团结的顺序上,唯一条件值的数量很少.性能非常重要:生成新列的最快方法是什么? 我在下面创建了一个示例案例,并尝试并比较了不同的方法. 在示例中,条件填充由 基于列label的值(此处:1, 2, 3之一)的字典查找. lookup_dict = { 1: 100, # arbitrary 2: 200, # arbitrary 3: 300, # arbitrary } 我希望我的数据框填充为: label output 0 3 300 1 2 200 2 3 300 3 3 300 4 2 200 5 2 200 6 1 100 7 1 10
0 2023-05-23
编程技术问答社区
Cython的速度提升与实用性
我刚遇到Cython,而我正在寻找优化Python代码的方法.我阅读了有关堆栈溢出的各种帖子,python wiki,并阅读了文章"一般优化规则". Cython是我最感兴趣的东西.您可以选择在Python代码中选择其他数据类型,而不是为自己编写C代码. 这是我尝试过的愚蠢测试, #!/usr/bin/python # test.pyx def test(value): for i in xrange(value): i**2 if(i==1000000): print i test(10000001) $ time python test.pyx real 0m16.774s user 0m16.745s sys 0m0.024s $ time cython test.pyx real 0m0.513s user 0m0.196s sys 0m0.052s
2 2023-05-23
编程技术问答社区