Pull to refresh

Comments 13

Спасибо, я и не знал о weave.

Несколько вопросов:
0) В данном случае получается, что Си соревнуется с Numpy, которая вроде тоже на Си или я не прав?
1) А что за тестовая машина? 2 ядра?
2) В 100х100 Питон обходит Си? Сказываются накладные расходы на передачу данных в Си?
3) Что значит Pure C? это Си вызванный из Питона или отдельное приложение?
1) Да, но иначе, я думаю, python бы проигрывал еще больше;
2) thinkpad 420 c core i5;
3) да, вызов weave достаточно тормозной;
4) Pure C — это weave без openMP.
> 4) Pure C — это weave без openMP.

Так и пишите «python with weave». Потому что когда вижу, что Pure C медленнее, чем питон, сразу не верю всем вашим результатам.
Согласен, не самая лучшая формулировка
Test on size: 100x100
Pure python: 0.0725984573364
Pure C: 0.303888320923
C plus OpenMP: 0.109100341797
Test - ok


«Прирост в скорости»? Интересно, с чем это связано.

Конечно же на малом размере матрицы прироста не будет, поскольку существенный объем времени тратится на вызов weave.
Если посмотреть сгенерированный исходник на С, то можно слегка ужаснуться от его объема!
А почему столбец вычитаете в цикле?

import time
import numpy
t0=time.time()
N=1000
c=100.0
matrix=numpy.random.random((N, N))
randArray=numpy.random.random((N, N))
matrix=matrix-randArray*c
print time.time()-t0


При N=1000 время 0.11 сек
При N=2000 время 0.44 сек
При N=3000 время 0.98 сек

Тестировалось на Core 2 Duo 2 GHz.

Но за описание scipy.weave и openMP спасибо!
Также numpy массивы передаются в C не в виде матрицы, а в виде вектора, именно поэтому в коде один цикл, а не два.
Ой, неверно вас понял, верхний комментарий — бред.
Цикл для того, чтобы код на С и на python были конструктивно похожи.
Получается, что реализация в numpy если полностью векторизовать (или векторизировать) код, то есть вместо циклов использовать матричные операции, работает при N=1000 в пять раз быстрее, чем pure C. На практике получается, что даже какие-то нерегулярные вычисления, например вычитания из элементов, расположенных вблизи диагонали матрицы (но не только на диагонали) при соблюдении каких-то логических условий (if в цикле) выгоднее делать через матричные операции numpy.

Но еще раз повторюсь, я не знал о scipy.weave и мне очень понравилось. Надо только придумать пример, когда матричные операции неприменимы, а на С можно решить, и тогда точно будет быстрее на больших размерностях.
Судя по этим тестам прирост скорости 2-3 кратный. По крайней мере для 2-х ядерного процессора. Для 4-х думаю не сильно больше будет. В перспективе можно будет использовать NumPyPy который уже сейчас дает двухкратный прирост скорости по сравнению с NumPy: morepypy.blogspot.com/2012/01/numpypy-status-update.html
Only those users with full accounts are able to leave comments. Log in, please.