python - 在 python 中从浮点元组列表构建 c 数组的最快方法是什么?

标签 python ctypes pyopengl

上下文:我的 Python 代码将二维顶点数组传递给 OpenGL。

我测试了 2 种方法,一种使用 ctypes,另一种使用 struct,后者快两倍以上。

from random import random
points = [(random(), random()) for _ in xrange(1000)]

from ctypes import c_float
def array_ctypes(points):
    n = len(points)
    return n, (c_float*(2*n))(*[u for point in points for u in point])

from struct import pack
def array_struct(points):
    n = len(points)
    return n, pack("f"*2*n, *[u for point in points for u in point])

还有其他选择吗? 关于如何加速此类代码的任何提示(是的,这是我的代码的瓶颈之一)?

最佳答案

您可以将 numpy 数组传递给 PyOpenGL 而不会产生任何开销。 (numpy 数组的 data 属性是指向底层 C 数据结构的缓冲区,它包含与您正在构建的数组相同的信息)

import numpy as np  
def array_numpy(points):
    n = len(points)
    return n, np.array(points, dtype=np.float32)

在我的电脑上,这比基于 struct 的方法快大约 40%。

关于python - 在 python 中从浮点元组列表构建 c 数组的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4156872/

相关文章:

python - 如何处理两个事件循环? Pyrogram 和 Tkinter 的

Python for Windows 在调用 MinGW-w64 编译库的函数时挂起

python - 如何从 PyOpenGL 中的单个数组中提取 glVertexPointer() 和 glColorPointer() 的数据?

python - 将 pygame 2d 水波纹转换为 pyOpenGL

python - 如何在python上制作镜面光照来实现Phong光照?

python - 如何使 ProcessPoolExecutor 中的任务表现得像守护进程?

python - 在 python 中将参数传递给 COM 对象

python - 如何从 Python 中并排绘制多个饼图?

python - 使用 ctypes 调用带有指针参数的 C++ 函数

python - 有没有办法在 python 中调用左键单击?