Comments 13
Спасибо, я и не знал о weave.
Несколько вопросов:
0) В данном случае получается, что Си соревнуется с Numpy, которая вроде тоже на Си или я не прав?
1) А что за тестовая машина? 2 ядра?
2) В 100х100 Питон обходит Си? Сказываются накладные расходы на передачу данных в Си?
3) Что значит Pure C? это Си вызванный из Питона или отдельное приложение?
Несколько вопросов:
0) В данном случае получается, что Си соревнуется с Numpy, которая вроде тоже на Си или я не прав?
1) А что за тестовая машина? 2 ядра?
2) В 100х100 Питон обходит Си? Сказываются накладные расходы на передачу данных в Си?
3) Что значит Pure C? это Си вызванный из Питона или отдельное приложение?
+1
Test on size: 100x100
Pure python: 0.0725984573364
Pure C: 0.303888320923
C plus OpenMP: 0.109100341797
Test - ok
«Прирост в скорости»? Интересно, с чем это связано.
0
А почему столбец вычитаете в цикле?
При N=1000 время 0.11 сек
При N=2000 время 0.44 сек
При N=3000 время 0.98 сек
Тестировалось на Core 2 Duo 2 GHz.
Но за описание scipy.weave и openMP спасибо!
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 спасибо!
+2
Также numpy массивы передаются в C не в виде матрицы, а в виде вектора, именно поэтому в коде один цикл, а не два.
0
Ой, неверно вас понял, верхний комментарий — бред.
Цикл для того, чтобы код на С и на python были конструктивно похожи.
Цикл для того, чтобы код на С и на python были конструктивно похожи.
0
Получается, что реализация в numpy если полностью векторизовать (или векторизировать) код, то есть вместо циклов использовать матричные операции, работает при N=1000 в пять раз быстрее, чем pure C. На практике получается, что даже какие-то нерегулярные вычисления, например вычитания из элементов, расположенных вблизи диагонали матрицы (но не только на диагонали) при соблюдении каких-то логических условий (if в цикле) выгоднее делать через матричные операции numpy.
Но еще раз повторюсь, я не знал о scipy.weave и мне очень понравилось. Надо только придумать пример, когда матричные операции неприменимы, а на С можно решить, и тогда точно будет быстрее на больших размерностях.
Но еще раз повторюсь, я не знал о scipy.weave и мне очень понравилось. Надо только придумать пример, когда матричные операции неприменимы, а на С можно решить, и тогда точно будет быстрее на больших размерностях.
0
Судя по этим тестам прирост скорости 2-3 кратный. По крайней мере для 2-х ядерного процессора. Для 4-х думаю не сильно больше будет. В перспективе можно будет использовать NumPyPy который уже сейчас дает двухкратный прирост скорости по сравнению с NumPy: morepypy.blogspot.com/2012/01/numpypy-status-update.html
+1
Sign up to leave a comment.
Python, scipy.weave и openMP — разгоняем код