Есть еще одна идея, с которой я столкнулся.У меня нет времени профилировать это прямо сейчас, но в случае, если кто-то другой делает:
# untested, but I'm fairly confident it runs
# using 'flattened points' list, i.e. a list of n*2 floats
points = [random() for _ in xrange(1000 * 2)]
c_array = c_float * len(points * 2)
c_array[:] = points
То есть сначала мы создаем массив ctypes, но не заполняем его.Затем мы заполняем его, используя обозначение среза.Люди, которые умнее меня, говорят, что назначение такого среза может повысить производительность.Это позволяет нам передавать список или итерацию непосредственно в RHS назначения, без необходимости использовать синтаксис * iterable , который будет выполнять некоторый промежуточный спор итерируемого.Я подозреваю, что это то, что происходит в глубине создания Пакетов Pyglet.
Предположительно, вы можете просто создать c_array один раз, а затем просто переназначать его (последняя строка в приведенном выше коде) каждый раз, когда меняется список точек.
Возможно, существует альтернативная формулировка, которая принимает исходное определение точек (список (x, y) кортежей). Примерно так:
# very untested, likely contains errors
# using a list of n tuples of two floats
points = [(random(), random()) for _ in xrange(1000)]
c_array = c_float * len(points * 2)
c_array[:] = chain(p for p in points)