Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
from threading import Thread, Lock
from multiprocessing import Process, Lock as PLock
class SharedObject(object):
def __init__(self, property):
self.property = property
def some_func(shared_obj, lock):
lock.acquire()
shared_obj.property += 1
print shared_obj.property,
lock.release()
if __name__ == '__main__':
# работа с потоками:
lock = Lock()
shared_obj = SharedObject(0)
for thread_number in range(5):
thread = Thread(target=some_func, args=(shared_obj, lock))
thread.start()
# 1 2 3 4 5
# работа с процессами:
lock = PLock()
shared_obj = SharedObject(0)
for process_number in range(5):
process = Process(target=some_func, args=(shared_obj, lock))
process.start()
# 1 1 1 1 1
R = numexpr.evaluate('1 / (1 + sqrt(Rx * Rx + Ry * Ry + Rz * Rz))'), то у меня сильно ускоряется (стаёт 0.6 секунд против 1.4 с numpy). Тут и многопоточность используется (процессор двухядерный).scipy.spatial.distance.cdist. А именно, просто cdist(p, q) (считает просто ||p-q||) работает у меня 0.35 с, а 1/(1+cdist(p, q)) (считает искомую матрицу) — 0.6 с. Ну и, numexpr.evaluate('1/(1+d)', local_dict={'d': cdist(p, q)}) работает менее 0.5 c :)from numbapro import cuda
@cuda.jit('void(float32[:], float32[:], float32[:])')
def sum(a, b, result):
i = cuda.grid(1) # equals to threadIdx.x + blockIdx.x * blockDim.x
result[i] = a[i] + b[i]
$python test_mp_python_ext.py
Traceback (most recent call last):
File "test_mp_python_ext.py", line 20, in <module>
import mp_cython_ext as mpcy
File "-py/tests/mp_cython.pyx", line 16, in init tests.mp_cython_ext (tests/mp_cython.c:16853)
import os, sys
SystemError: Parent module '' not loaded, cannot perform relative import
@cython.boundscheck(False)
@cython.wraparound(False)
def par(N):
pR = np.empty(N)
cdef int i
cdef int nN = N
cdef double[:] R = pR
with nogil, parallel():
for i in prange(nN):
R[i] = scipy.special.j0(i)
return R
Сами по себе NumPy и SciPy работают достаточно быстро и вполне параллельно, особенно в части линейной алгебры.
И почти всегда в нашем самостоятельном коде можно выделить небольшую часть кода — узкое место, оптимизировав которое мы добьемся значительного прироста в производительности. Например, в моем коде это специальная процедура вычисления сингулярных интегралов.
F(k) = \int f(x,k)dx
А как это сделать-то? Вот есть у меня СЛАУ, пишу я a=numpy.linalg.solve(M, b). Считает всё-равно в один тред, так что приходится использовать multiprocessing, что ещё те костыли, ни лямбд, ни динамических объектов.
2. f(x,k) должна быть полностью реализована на cython. А это можно быть значительный кусок программы.
И еще раз о GIL в Python