import random
import time
import multiprocessing as mp
num_partitions = 10
num_workers = 4
def init_arr():
return [random.random()*10 for _ in range(10_000_000)]
def my_func(arr):
return list(map(lambda el: el**2, 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)]
pool = mp.Pool(num_workers)
data = pool.map(func, splitted)
pool.join()
pool.close()
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):
self.started = time.time()
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:
test1(arr)
aW1wb3J0IHJhbmRvbQppbXBvcnQgdGltZQppbXBvcnQgbXVsdGlwcm9jZXNzaW5nIGFzIG1wCgpudW1fcGFydGl0aW9ucyA9IDEwCm51bV93b3JrZXJzID0gNAoKCmRlZiBpbml0X2FycigpOgogICAgcmV0dXJuIFtyYW5kb20ucmFuZG9tKCkqMTAgZm9yIF8gaW4gcmFuZ2UoMTBfMDAwXzAwMCldCgoKZGVmIG15X2Z1bmMoYXJyKToKICAgIHJldHVybiBsaXN0KG1hcChsYW1iZGEgZWw6IGVsKioyLCBhcnIpKQoKCmRlZiBwYXJhbGxlbGl6ZV9kYXRhZnJhbWUoZGF0YSwgZnVuYyk6CiAgICBwYXJ0aW9uX3NpemUgPSBsZW4oZGF0YSkgLy8gbnVtX3BhcnRpdGlvbnMKICAgIHNwbGl0dGVkID0gW2RhdGFbaSAqIHBhcnRpb25fc2l6ZTooaSArIDEpICogcGFydGlvbl9zaXplXSBmb3IgaSBpbiByYW5nZShudW1fcGFydGl0aW9ucyldCiAgICBwb29sID0gbXAuUG9vbChudW1fd29ya2VycykKICAgIGRhdGEgPSBwb29sLm1hcChmdW5jLCBzcGxpdHRlZCkKICAgIHBvb2wuam9pbigpCiAgICBwb29sLmNsb3NlKCkKICAgIHJldHVybiBkYXRhCgoKZGVmIHRlc3QxKGFycik6CiAgICBteV9mdW5jKGFycikKCgpkZWYgdGVzdDIoYXJyKToKICAgIHBhcmFsbGVsaXplX2RhdGFmcmFtZShhcnIsIG15X2Z1bmMpCgoKY2xhc3MgTXlUaW1lcjoKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYuc3RhcnRlZCA9IE5vbmUKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHNlbGYuc3RhcnRlZCA9IHRpbWUudGltZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CiAgICAgICAgcHJpbnQoZid7dGltZS50aW1lKCktc2VsZi5zdGFydGVkfSBzZWNzIGVsYXBzZWQgZm9yIHtzZWxmLm5hbWV9JykKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgYXJyID0gaW5pdF9hcnIoKQoKICAgIHdpdGggTXlUaW1lcignU3luYycpIGFzIHN5bmNfdDoKICAgICAgICB0ZXN0MShhcnIpCgogICAgd2l0aCBNeVRpbWVyKCdQYXJhbGxlbCcpIGFzIHBhcl90OgogICAgICAgIHRlc3QxKGFycikK