import random
import multiprocessing as mp
num_partitions = 20
num_workers = 4
def init_arr():
return [random.random()*10 for _ in range(1_000_000)]
def calc(num):
for i in range(100):
num *= 0.0001
return num
def my_func(arr):
return list(map(calc, arr))
def parallelize_dataframe(data, func):
partion_size = len(data) // num_partitions
splitted = [data[i * partion_size:(i + 1) * partion_size] for i in range(num_partitions)]
with mp.Pool(num_workers) as pool:
data = pool.map(func, splitted)
return data
def test1(arr):
my_func(arr)
def test2(arr):
parallelize_dataframe(arr, my_func)
class MyTimer:
def __init__(self, name):
self.name = name
self.started = None
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print(f'{time.time()-self.started} secs elapsed for {self.name}')
if __name__ == '__main__':
arr = init_arr()
with MyTimer('Sync') as sync_t:
test1(arr)
with MyTimer('Parallel') as par_t:
test2(arr)
aW1wb3J0IHJhbmRvbQppbXBvcnQgdGltZQppbXBvcnQgbXVsdGlwcm9jZXNzaW5nIGFzIG1wCiAKbnVtX3BhcnRpdGlvbnMgPSAyMApudW1fd29ya2VycyA9IDQKIApkZWYgaW5pdF9hcnIoKToKICAgIHJldHVybiBbcmFuZG9tLnJhbmRvbSgpKjEwIGZvciBfIGluIHJhbmdlKDFfMDAwXzAwMCldCgoKZGVmIGNhbGMobnVtKToKICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CiAgICAgICAgbnVtICo9IDAuMDAwMQogICAgcmV0dXJuIG51bQogCmRlZiBteV9mdW5jKGFycik6CiAgICByZXR1cm4gbGlzdChtYXAoY2FsYywgYXJyKSkKIAogCmRlZiBwYXJhbGxlbGl6ZV9kYXRhZnJhbWUoZGF0YSwgZnVuYyk6CiAgICBwYXJ0aW9uX3NpemUgPSBsZW4oZGF0YSkgLy8gbnVtX3BhcnRpdGlvbnMKICAgIHNwbGl0dGVkID0gW2RhdGFbaSAqIHBhcnRpb25fc2l6ZTooaSArIDEpICogcGFydGlvbl9zaXplXSBmb3IgaSBpbiByYW5nZShudW1fcGFydGl0aW9ucyldCiAgICB3aXRoIG1wLlBvb2wobnVtX3dvcmtlcnMpIGFzIHBvb2w6CiAgICAgICAgZGF0YSA9IHBvb2wubWFwKGZ1bmMsIHNwbGl0dGVkKQogICAgcmV0dXJuIGRhdGEKIAogCmRlZiB0ZXN0MShhcnIpOgogICAgbXlfZnVuYyhhcnIpCiAKIApkZWYgdGVzdDIoYXJyKToKICAgIHBhcmFsbGVsaXplX2RhdGFmcmFtZShhcnIsIG15X2Z1bmMpCiAKIApjbGFzcyBNeVRpbWVyOgogCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYuc3RhcnRlZCA9IE5vbmUKIAogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICBzZWxmLnN0YXJ0ZWQgPSB0aW1lLnRpbWUoKQogICAgICAgIHJldHVybiBzZWxmCiAKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKICAgICAgICBwcmludChmJ3t0aW1lLnRpbWUoKS1zZWxmLnN0YXJ0ZWR9IHNlY3MgZWxhcHNlZCBmb3Ige3NlbGYubmFtZX0nKQogCiAKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIGFyciA9IGluaXRfYXJyKCkKIAogICAgd2l0aCBNeVRpbWVyKCdTeW5jJykgYXMgc3luY190OgogICAgICAgIHRlc3QxKGFycikKIAogICAgd2l0aCBNeVRpbWVyKCdQYXJhbGxlbCcpIGFzIHBhcl90OgogICAgICAgIHRlc3QyKGFycikKCg==