3

I calculated vector using numpy. How can I calculate vector using multicore and numpy?

import numpy as np

num_row, num_col = 6000, 13572

ss = np.ones((num_row, num_col), dtype=np.complex128)
ph = np.random.standard_normal(num_row)
fre = np.random.standard_normal(num_row)
tau = np.random.standard_normal(num_col)

for idx in range(num_row):
    ss[idx, :] *= np.exp(1j*(ph[idx] + fre[idx]*tau))
1
  • take a look at tensorflow.org the multi calc comes out of the box... Commented Apr 18, 2018 at 14:05

1 Answer 1

4

We could leverage broadcasting to have a NumPy based solution -

ss = np.exp(1j*(ph[:,None] + fre[:,None]*tau))

Porting this over to numexpr to leverage fast transcendental operations alongwith multi-core capability -

import numexpr as ne

def numexpr_soln(ph, fre):
    ph2D = ph[:,None]
    fre2D = fre[:,None]
    return ne.evaluate('exp(1j*(ph2D + fre2D*tau))')

Timings -

In [23]: num_row, num_col = 6000, 13572
    ...: ss = np.ones((num_row, num_col), dtype=np.complex128)
    ...: ph = np.random.standard_normal(num_row)
    ...: fre = np.random.standard_normal(num_row)
    ...: tau = np.random.standard_normal(num_col)

# Original soln
In [25]: %%timeit
    ...: for idx in range(num_row):
    ...:     ss[idx, :] *= np.exp(1j*(ph[idx] + fre[idx]*tau))
1 loop, best of 3: 4.46 s per loop

# Native NumPy broadcasting soln
In [26]: %timeit np.exp(1j*(ph[:,None] + fre[:,None]*tau))
1 loop, best of 3: 4.58 s per loop

For Numexpr solution with varying number of cores/threads -

# Numexpr solution with # of threads = 2
In [51]: ne.set_num_threads(nthreads=2)
Out[51]: 2

In [52]: %timeit numexpr_soln(ph, fre)
1 loop, best of 3: 2.18 s per loop

# Numexpr solution with # of threads = 4
In [45]: ne.set_num_threads(nthreads=4)
Out[45]: 4

In [46]: %timeit numexpr_soln(ph, fre)
1 loop, best of 3: 1.62 s per loop

# Numexpr solution with # of threads = 8
In [48]: ne.set_num_threads(nthreads=8)
Out[48]: 8

In [49]: %timeit numexpr_soln(ph, fre)
1 loop, best of 3: 898 ms per loop
Sign up to request clarification or add additional context in comments.

3 Comments

I tried "ss *= np.exp(1j*(ph[:,None] + fre[:,None]*tau))". But It is slower than my code.
Thank you Very much
Why not posting an answer about it?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.