首页 > 编程问答 >并行化 numpy.sort

并行化 numpy.sort

时间:2024-07-22 16:11:45浏览次数:6  
标签:python numpy sorting parallel-processing cython

我需要对长度为1e8-1e9的uint64数组进行排序,这是我当前项目中的性能瓶颈之一。我最近刚刚更新了numpy v2.0版本,其中排序算法得到了显着优化。在我的硬件上测试它,它比 numpy v1.26 版本快大约 5 倍。但目前 numpy 的排序算法即使使用 SIMD,也无法利用多核 CPU。

我尝试将其并行化并同时对多个 np.array 进行排序。一种可能的方法是使用 numba prange,但 numba 对 numpy 排序的支持一直很差。 numba.jit 甚至对 np.sort 有减慢效果,并且 numba v0.60.0 未能跟进 numpy v2.0 对排序的优化( https://github.com/numba/numba/issues/9611| ||)。替代方案是 cython prange,但 cython 不允许在 nogil 处创建 Python 对象。有没有办法使用 cython 或其他方式并行排序 numpy.array ?如果使用 cpp 的并行排序库,考虑到数据类型转换的开销,它们是否比 numpy 自己的排序更快? ). The alternative is cython prange, but cython does not allow the creation of Python objects at nogil. Is there a way to sort numpy.array in parallel using cython or otherwise? If using cpp's parallel sorting libraries, are they faster than numpy's own sorting, taking into account the overhead of data type conversions?

arr=np.random.randint(0,2**64,int(3e8),dtype='uint64')  
sorted_arr=np.sort(arr)  # single thread np.sort takes 4 seconds (numpy v2.0.0)

当然,我可以帮助你探索在 Python 中并行化 numpy.sort 的方法。你已经概述了你面临的挑战,即 NumPy 的排序算法本身并不会跨多个核进行并行化。以下是你可以尝试的一些方法:

  1. 基于分块的并行化与 multiprocessing

  2. 方法: 将你的数组分成若干个块,使用 multiprocessing.Pool 并行排序这些块,然后合并已排序的块。

  3. 优点: 相对容易实现;绕过了 NumPy 排序中的 GIL 限制。
  4. 缺点: 合并已排序的块(例如,使用 numpy.concatenate 后跟另一个 numpy.sort )可能会引入开销,特别是在处理大型数组时。

```python import numpy as np from multiprocessing import Pool, cpu_count

def sort_chunk(arr): return np.sort(arr)

def parallel_sort(arr, num_processes=None): if num_processes is None: num_processes = cpu_count() chunk_size = len(arr) // num_processes chunks = [arr[i * chunk_size:(i + 1) * chunk_size] for i in range(num_processes - 1)] chunks.append(arr[(num_processes - 1) * chunk_size:]) # 最后一块 with Pool(num_processes) as pool: sorted_chunks = pool.map(sort_chunk, chunks) sorted_arr = np.concatenate(sorted_chunks) return np.sort(sorted_arr) # 再次排序以合并

arr = np.random.randint(0, 2**64, int(3e8), dtype='uint64') sorted_arr = parallel_sort(arr) ```

  1. Cython 与外部并行排序库

  2. 方法: 使用 Cython 将你的 NumPy 数组传递给用 C/C++ 编写的并行排序库(例如,来自 STL 的 std::sort 与执行策略或 Intel TBB)。

  3. 优点: 可能会带来显著的性能提升,特别是在对排序库进行微调以充分利用你的硬件时。
  4. 缺点: 比基于 multiprocessing 的方法更复杂;需要 Cython 知识以及与外部库的链接。

```cython # 需要安装一个外部并行排序库并进行链接 cdef extern from "some_parallel_sort_library.h": void parallel_sort(unsigned long long *arr, size_t n)

def sort_array(np.ndarray[np.uint64_t, ndim=1] arr): cdef size_t n = arr.size with nogil: parallel_sort(&arr[0], n) return arr ```

  1. 其他 Python 并行化库

  2. 探索诸如 Dask Ray 之类的库,它们提供了对并行计算的高级抽象,并且可以有效地处理大型数组。这些库通常可以很好地与 NumPy 数组配合使用,并且可以提供通过分布式计算进行扩展的途径。

评估和考虑因素

  • 数据集大小: 对于非常小的数组,并行化的开销可能超过了性能优势。如果你的数组已经很大(如你的情况),并行化很可能是值得的。
  • 硬件: 可用内核的数量和内存带宽将显着影响并行化的有效性。对不同的方法进行基准测试,找到适合你特定硬件的最佳方法。
  • 开销: 请注意数据移动、进程间通信和合并已排序结果相关的开销。

请记住,没有一种放之四海而皆准的最佳方法。我建议你试验这些不同的方法,并使用真实数据对它们进行基准测试,以确定哪种方法最适合你的用例。

标签:python,numpy,sorting,parallel-processing,cython
From: 78653708

相关文章

  • 写一个 python daemo 注册到nacos中
     """注册到nacos中的deamonnacos:2.3.2(模式:standalone)python:3.6.8nohuppython3demon.py&"""importrequestsimportthreadingimporttime#Nacos服务器地址和端口nacos_url="http://127.0.0.1:8848"#Nacos登录信息user......
  • Python、图形用户界面、ctk
    所以,我正在创建一个博客,现在,我在设置部分,我有一个带有按钮的滑动面板,我希望它转到一个新窗口,我将在其中创建新的小部件等...,我已经完成了这种登录和注册的事情,问题是现在我不能使用pack.forget(),它只是不起作用classSlidePanel(customtkinter.CTkFrame):def__init__(se......
  • 当我的代码损坏时,如何设置警报或蜂鸣声? (最好是Python)
    我正在为机器人运行一些代码,它将继续运行,直到我手动终止该进程。或者,如果代码意外遇到诸如SYntaxError或其他此类错误/异常之类的错误并崩溃。我想知道当我的代码崩溃时是否可以设置一些警报或蜂鸣声。我的目标就是将视线从屏幕上移开,仅在进程停止运行时才检查它。如果......
  • VScode连接虚拟机运行Python文件的方法
    声明:本文使用Linux发行版本为rocky_9.4目录1.在rocky_9.4最小安装的系统中,默认是没有tar工具的,因此,要先下载tar工具2.在安装好的vscode中下载ssh远程插件工具3.然后连接虚拟机4.查看python是否已经安装5.下载扩展插件6.新建.py文件测试1.在rocky_9.4最小安装......
  • 【介绍Python多进程】
    ......
  • 用python制作终端向上滑动的效果
    我正在开发一个项目,需要时需要过渡效果。我正在通过CRT终端模拟器“cool-retro-term”运行这个python项目。我想让它像老式CRT终端一样,屏幕平滑地向上滑动所有字符以呈现下一行或刷新屏幕。像这样:终端滑动效果不是单独打印的字符,而是屏幕的滚动。到目......
  • centos stream9(linux): 编译安装python 3.12.4
    一,官方下载地址:https://www.python.org/downloads/点击进入具体版本的下载页面,我们选择稳定版本,地址:https://www.python.org/downloads/release/python-3124/如图:复制得到下载链接:https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz 二,下载:从命令行下载:......
  • 使用 beautifulsoup python 更改内部标签的文本
    我想更改使用Beautifulsoup获得的HTML中标签的内部文本。示例:<ahref="index.html"id="websiteName">Foo</a>变成:<ahref="index.html"id="websiteName">Bar</a>我已经设法通过其id获取标签:HTMLDocument.find(id......
  • Python - Adob​​e InDesign Javascript 脚本帮助从 Python 调用 JSX
    提前致谢。希望每个人都表现出色。我试图从python调用Adob​​eIndesignJSX文件,下面是示例代码:我想在Adob​​eINdesign2024或更高版本上运行它。我在PythonInDesign脚本编写上看到了一些示例:从预检中获取溢出文本框以自动调整大小作为参考,可能适用于Ado......
  • 为什么将小部件添加到滚动视图在 python kivy 中不起作用
    Python文件fromkivymd.appimportMDAppfromkivy.langimportBuilderfromkivy.uix.floatlayoutimportFloatLayoutfromkivy.core.windowimportWindowfromkivy.configimportConfigfromkivymd.uix.listimportOneLineListItem#UkuranwindowConfig.set(&......