小编Yos*_*shi的帖子

Python:如何分析使用numba.njit()装饰器编写的代码

我有一个相当复杂的计算代码,我正在尝试加速和实现多线程。为了优化代码,我试图确定哪些函数使用时间最长或被调用最多。

我之前还没有真正分析过代码,所以我可能会丢失一些东西。但是,我知道由于LLVM的重新编译,许多现有的分析模块实际上不能与numba的njit()装饰器配合使用。

所以我的问题是:配置代码的最佳方法是什么,其中大多数函数具有njit()装饰器,并带有一些非固定控件功能?

我之前遇到过data_profiler,但是它似乎不再位于conda存储库中,并且我不知道如何从conda中的源代码构建它,或者它是否仍与其依赖关系的现代版本兼容。

python profiling hpc numba

6
推荐指数
1
解决办法
172
查看次数

定义多个相同类型对象的内存效率更高的方法

所以,我正在涉足等离子体模拟的世界。现在,虽然我知道顶级模拟是用 Fortran 编写的,并且具有超内存效率的子例程和专用代码,但我希望只运行一些低级模拟。

我的问题是,在时变环境(好吧,时间步进)中模拟大量粒子时,跟踪所有数据是一个技巧。我之前使用过多维数组——使用粒子的列号和属性的行号,但是这感觉很笨拙。然而,它似乎执行得更快。

我最近尝试定义我自己的类,但是作为一个 Python 新手,我可能以一种非常低效的方式做到了。对于 3 维中的每个粒子,我需要能够存储粒子的位置、速度和力(一旦代码变得更复杂,就有可能添加更多变量)。使用我对类的了解,我定义了一个particle对象(我认为),它使我的代码更易于阅读和遵循:

# Define Particle as a class
class particle():
    def __init__(self, index=0, pos=np.array([0, 0, 0]), vel=np.array([0,0,0]), 
                 F=np.array([0, 0, 0])):
        self.index = index      # Particle index (identifier)
        self.pos = pos          # Position 3-vector
        self.vel = vel          # Velocity 3-vector
        self.F = F              # Net force 3-vector (at particle)
Run Code Online (Sandbox Code Playgroud)

因此,我可以轻松地初始化包含大量这些对象的数组,并以相当简单的方式修改每个值。然而,正如我所提到的,这对于仅涉及少数粒子的模拟运行速度较慢。我将使用我的代码将其与纯粹面向矩阵的方法进行比较,以查看哪种方法在大型模拟中的扩展性更好。

我想我的问题是:以这种方式定义“粒子”是最有效的吗?或者是否有更高效的 CPU/内存方式来定义这样的对象。我想保留它的方法能力(即particle[i].pos = [1,2,3]particle[2].vx[1] = 3),以便我可以为每个粒子设置值,并将它们传递给函数。请记住,我是 Python 新手,所以我可能不会在大型复杂代码上取得巨大成功。

python arrays simulation types class

5
推荐指数
1
解决办法
151
查看次数

使用CUDA的希尔伯特变换

为了在1D阵列上进行希尔伯特变换,必须:

  • FFT数组
  • 数组的两半,另一半为零
  • 反FFT结果

我正在使用PyCuLib进行FFT.我的代码到目前为止

def htransforms(data):
    N = data.shape[0]
    transforms       = nb.cuda.device_array_like(data)          # Allocates memory on GPU with size/dimensions of signal
    transforms.dtype = np.complex64                             # Change GPU array type to complex for FFT 

    pyculib.fft.fft(signal.astype(np.complex64), transforms)    # Do FFT on GPU

    transforms[1:N/2]      *= 2.0      # THIS STEP DOESN'T WORK
    transforms[N/2 + 1: N]  = 0+0j     # NEITHER DOES THIS ONE

    pyculib.fft.ifft_inplace(transforms)                        # Do IFFT on GPU: in place (same memory)    
    envelope_function      = transforms.copy_to_host()          # Copy results to host (computer) memory …
Run Code Online (Sandbox Code Playgroud)

python signal-processing numba

5
推荐指数
1
解决办法
347
查看次数

迭代使用自己的输出的数组的最佳方法

首先,我想为措辞严厉的标题道歉 - 我目前无法想到一个更好的方式来表达它.基本上,我想知道是否有更快的方法在Python中实现数组操作,其中每个操作以迭代方式依赖于先前的输出(例如,前向差分操作,过滤等).基本上,操作的形式如下:

for n in range(1, len(X)):
    Y[n] = X[n] + X[n - 1] + Y[n-1]
Run Code Online (Sandbox Code Playgroud)

X值的数组在哪里,Y是输出.在这种情况下,Y[0]假设在上述循环之前单独知道或计算.我的问题是:是否有NumPy功能来加速这种自引用循环?这是几乎所有脚本的主要瓶颈.我知道NumPy例程可以从C例程执行中受益,所以我很好奇是否有人知道任何有助于此的numpy例程.否则,是否有更好的方法来编程这个循环(在Python中),这将加速其对大数组大小的执行?(> 500,000个数据点).

python arrays performance loops numpy

4
推荐指数
3
解决办法
496
查看次数