50455


multiprocessingのPoolを使いましたが、使わないより遅いのはなぜでしょうか？

[code]

    import time
    from multiprocessing import Pool
    
    def f(x):
      return x*x
    
    start = time.time()
    with Pool(processes=4) as p:
      p.map(f,range(10))
    
    print(f'time1:{time.time()-start}')
    
    start = time.time()
    a = [f(x) for x in range(10)]
    
    print(f'time2:{time.time()-start}')
    
[/code]

**結果**

[code]

    time1:0.1648421287536621
    time2:6.29425048828125e-05
    
[/code]

**実行環境**  
Python 3.7.0  
macOS High Sierra  
プロセッサ: 2.3 GHz Intel Core i5  
メモリ: 16 GB 2133 MHz LPDDR3

# **追記**

PicoSushiさんのご回答で、オーバーヘッドが原因ということがわかりました。sleepでmultiprocessingの効果を確認できましたが、データを増やして見ると、やはりmultiprocessingの方が遅くなります。  
大量な計算を行う時にmultiprocessingを使わないほうがいいでしょうか？それとも他の方法がありますか？

[code]

    import time
    from multiprocessing import Pool
    
    def f(x):
      return x*x
    
    start = time.time()
    with Pool(processes=4) as p:
      p.map(f,range(10000000))
    
    print(f'time1:{time.time()-start}')
    
    start = time.time()
    a = [f(x) for x in range(10000000)]
    
    print(f'time2:{time.time()-start}')
    
[/code]

**結果**

[code]

    time1:2.1132028102874756
    time2:1.4385631084442139
    
[/code]


CC BY-SA 4.0
2018-11-20T03:01:56.977
50453
2023-11-13T08:12:51.633
2023-11-13T08:12:51.633
3060
31068
question
python python3 python-multiprocessing
Python3 で multiprocessing の Pool を使うと遅くなるのはなぜ？


# 原因

`time1`では、マルチプロセスにするためのオーバーヘッドが存在し、これが`f(x)`の計算コストに比べて大きいためと推測します。

# multiprocessingの効果を確認する例

f(x)の計算に1秒掛かる場合、を`time.sleep`で表現してみました。

[code]

    import time
    from multiprocessing import Pool
    
    def f(x):
      time.sleep(1)
      return x*x
    
    start = time.time()
    with Pool(processes=4) as p:
      a = p.map(f,range(10))
    
    print(a)
    print(f'time1:{time.time()-start}')
    
    start = time.time()
    a = [f(x) for x in range(10)]
    
    print(a)
    print(f'time2:{time.time()-start}')
    
[/code]

結果

[code]

    [1, 1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]
    time1:3.034400224685669
    [1, 1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]
    time2:10.012826442718506
    
[/code]


CC BY-SA 4.0
2018-11-20T03:12:53.793
50455
2018-11-20T03:12:53.793
29826
50453
answer