Amazon オーディブル2ヶ月無料キャンペーン中 5/9まで

【Python】Parallels上のUbuntu 22.10でPython 3.11.0のベンチマークをとってみる

10 min
更新情報

2022年12月1日:
UTM 4.0.9
のゲストOSでUbuntu 22.10、Python 3.11.0のベンチマークを追加

こんにちは。ナミレリです。みなさん、UbuntuでもPythonは使っていますか?

前回の記事で、M1 Max、M2 Air、Intel Core i7のMacbookでPythonのベンチマークをとりました。シングルコアの性能が高いM2のMacbook Airがほぼ全ての項目で良い結果となりました。2019年のIntel Core i7のほぼ2倍のパフォーマンスです。詳しくは下の記事をご覧ください。

今回は、Parallels Desktop for Mac上のUbuntu22.10で同じPythonのベンチマークをとっていたところ、母艦のM1 Maxより速い結果の項目もあり、そんなこともあるのか!という思いからまとめてみたいと思います。配列アクセス意外はゲストOSの方が速い!というのは意外でしたParallels Desktop for Macが優秀ということなのか、たまたまなのか・・・。そんな思いからの記事です。

この記事の計測環境
Parallelsの母艦
  • MacBook Pro 14インチ M1Max(メモリ32GB)
  • macOS Ventura 13.0.1
  • pyenv 2.3.6
  • Python 3.11.0
ParallelsのゲストOS
Parallels 19 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。
NEW Parallels Desktop 19 for Mac

Parallels Desktop 19 for Macは、M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

14日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

計測環境について

Parallels Desktop for Macの母艦はM1 Maxの14インチMacBook Proで、ゲストOSはUbuntu 22.10です。

M1 Max(Parallelsの母艦)


sysctl -a | grep -e brand_string -e cpu.core_count
machdep.cpu.core_count: 10
machdep.cpu.brand_string: Apple M1 Max

ParallelsのゲストOS(Ubuntu 22.10)


lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.10
Release:	22.10
Codename:	kinetic
uname -a
Linux ubuntu-kinetic 5.19.0-23-generic #24-Ubuntu SMP PREEMPT_DYNAMIC Fri Oct 14 15:40:27 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

Amazon オーディブル:2ヶ月無料キャンペーン中(5/9まで)→ 詳しくはこちら

はじめに

Python 3.11.0の高速化や新機能については下記サイトを参考にさせていただきました。

また、この記事で比較する処理については下記のサイトを参考にさせていただきました。

1. forループ処理

単純なforによるループ処理を計測してみます。0から100,000,000までの数字をforによりループさせ、それを10回繰り返す処理です。処理が終わったら平均を秒で出力します。


import timeit

def test():
    for i in range(n):
        pass

n = 100000000  # 10^8
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max(母艦)0.945
Ubuntu on Parallels 18 for Mac0.852
Ubuntu 22.10 on UTM0.854
表:forループ処理

Parallels Desktop for MacのゲストOS(Ubuntu)が9.8%高速という結果に。

2. 代入処理

上の単純なforによるループ処理に加えて、ans = iの代入を追加したプログラムです。

0から100,000,000までの数字をforによりループさせ、都度その数値をansに代入しています。それを10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    ans = 0
    for i in range(n):
        ans = i

n = 100000000  # 10^8
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max1.071
Ubuntu on Parallels 18 for Mac0.995
Ubuntu 22.10 on UTM0.996
表:代入処理

Parallels Desktop for MacのゲストOS(Ubuntu)が7.1%高速という結果に。

Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

Amazon オーディブル:2ヶ月無料キャンペーン中(5/9まで)→ 詳しくはこちら

3. 定数を使った四則演算

0から100,000,000までの数字をforによりループさせ、都度、決まった四則演算を行っています。10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    for i in range(n):
        1 + 1
        1 - 1
        1 * 1
        1 // 1
        
n = 100000000  # 10^8
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max1.107
Ubuntu on Parallels 18 for Mac0.966
Ubuntu 22.10 on UTM0.977
表:定数を使った四則演算

Parallels Desktop for MacのゲストOS(Ubuntu)が12.7%高速という結果に。

4. 変数を使った四則演算

2から100,000,000までの数字をforによりループさせ、繰り返し変数iを使って四則演算を行っています。10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    for i in range(2, n):
        i * (i % (i - 1)) + i
        
n = 100000000  # 10^8
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max4.832
Ubuntu on Parallels 18 for Mac4.325
Ubuntu 22.10 on UTM4.374
表:変数を使った四則演算

Parallels Desktop for MacのゲストOS(Ubuntu)が10.5%高速という結果に。

5. if文

0から100,000,000までの数字をforによりループさせ、if文の条件で繰り返し変数i0だったら、という処理をしています。全体を10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    for i in range(n):
        if i == 0:
            pass
    
n = 100000000  # 10^8
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max1.345
Ubuntu on Parallels 18 for Mac1.255
Ubuntu 22.10 on UTM1.273
表:if文

Parallels Desktop for MacのゲストOS(Ubuntu)が6.7%高速という結果に。

配列アクセス

6. シーケンシャル

0から100,000,000までのリストAを用意して、順番にリストの要素にアクセスします。全体を10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    A = [i for i in range(n)]
    for a in A:
        pass

n = 100000000  # 10^8
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max2.111
Ubuntu on Parallels 18 for Mac21.660
Ubuntu 22.10 on UTM22.431
表:配列アクセス

配列のアクセスについてはParallels Desktop for MacのゲストOS(Ubuntu)がとても遅く、母艦のM1 Maxより10倍遅いという結果に。

7. ランダムアクセス(Read)

0から100,000,000までのリストAを用意して、indexを指定してリストの要素にアクセスします。全体を10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    A = [i for i in range(n)]
    for i in range(n):
        A[i]

n = 100000000  # 10^8
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max3.063
Ubuntu on Parallels 18 for Mac25.505
Ubuntu 22.10 on UTM23.621
表:ランダムアクセス(Read)

配列のランダムアクセスもParallels Desktop for MacのゲストOS(Ubuntu)がとても遅く、母艦のM1 Maxより8.3倍遅いという結果に。

8. ランダムアクセス(Write)

0から100,000,000までのリストAを用意して、indexを指定してリストの要素にアクセスします。その要素に0を代入します。全体を10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    A = [i for i in range(n)]
    for i in range(n):
        A[i] = 0

n = 100000000  # 10^8
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max3.514
Ubuntu on Parallels 18 for Mac13.500
Ubuntu 22.10 on UTM5.802
表: ランダムアクセス(Write)

配列のランダムアクセスのWriteもParallels Desktop for MacのゲストOS(Ubuntu)がとても遅く、母艦のM1 Maxより3.8倍遅いという結果に。

9. ソート

0から1,000,000までランダムな順番のリストAを用意し、その後リストAをソートします。全体を10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit
from random import randint, seed
seed(0)

def test():
    A = [randint(1, n) for _ in range(n)]
    A.sort()

n = 1000000  # 10^6
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max0.409
Ubuntu on Parallels 18 for Mac0.413
Ubuntu 22.10 on UTM0.418
表:ソート

母艦のM1 MaxとParallels Desktop for MacのゲストOS(Ubuntu)はほぼ同等の速度です。

文字列結合

10. +による結合

0から10,000,000までの数字をforによりループさせ、都度、文字列aを結合します。10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    ans = ''
    for i in range(n):
        ans += 'a'

n = 10000000  # 10^7
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max0.464
Ubuntu on Parallels 18 for Mac0.298
Ubuntu 22.10 on UTM0.297
表: +による結合

Parallels Desktop for MacのゲストOS(Ubuntu)が35.8%高速という結果に。

11. joinによる結合

0から10,000,000までのリストA(文字列)を用意して、リストの各要素を区切り文字なしで結合します。10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    A = [str(i) for i in range(n)]
    ans = ''.join(A)

n = 10000000  # 10^7
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max0.835
Ubuntu on Parallels 18 for Mac0.665
Ubuntu 22.10 on UTM0.657
表: joinによる結合

Parallels Desktop for MacのゲストOS(Ubuntu)が20.4%高速という結果に。

モジュール

12. deque

0から10,000,000までのdequeオブジェクトを用意し、0から10,000,000までの数字をforによりループさせ、dequeオブジェクトの先頭の要素を取り出し(que.popleft())、その要素を末尾に追加します(que.append())。10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit
from collections import deque

def test():
    que = deque(range(n))
    for i in range(n):
        que.append(que.popleft())

n = 10000000  # 10^7
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max0.405
Ubuntu on Parallels 18 for Mac0.394
Ubuntu 22.10 on UTM0.381
表:deque

Parallels Desktop for MacのゲストOS(Ubuntu)が2.7%高速という結果に。ほぼ同じですね。

13. 優先度付きキュー

Python標準ライブラリのheapqを使い、リストqueに0から10,000,000までを優先度付きキューの要素に挿入します。その後、優先度付きキューから最小値を取り出します。この処理を10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit
import heapq

def test():
    que = [0]
    for i in range(n):
        heapq.heappush(que, i)

    for i in range(n):
        heapq.heappop(que)

n = 10000000  # 10^7
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max3.326
Ubuntu on Parallels 18 for Mac3.729
Ubuntu 22.10 on UTM3.787
表:優先度付きキュー

Parallels Desktop for MacのゲストOS(Ubuntu)が、母艦のM1 Maxより12.1%遅いという結果に。

14. 組み込み関数呼び出し

0から10,000,000までの数字をforによりループさせ、max関数により繰り返し変数i0の2つの要素の内、最大値を持つ要素の値を取得します。この処理を10回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def test():
    for i in range(n):
        max(0, i)

n = 10000000  # 10^7
loop = 10

result = timeit.timeit('test()', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max0.773
Ubuntu on Parallels 18 for Mac0.737
Ubuntu 22.10 on UTM0.731
表:組み込み関数呼び出し

Parallels Desktop for MacのゲストOS(Ubuntu)が4.7%高速という結果に。ほぼ同じですね。

15. 再帰関数

40番目のフィボナッチ数列を再帰処理で求めます。3回繰り返し、処理が終わったら平均を秒で出力します。


import timeit

def fibonacci(n):
    if n == 0 or n == 1:
        return n
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)

n = 40
loop = 3

result = timeit.timeit('fibonacci(n)', globals=globals(), number=loop)
print(format(result / loop, '.3f'))
Python 3.11.0
M1 Max12.174
Ubuntu on Parallels 18 for Mac13.076
Ubuntu 22.10 on UTM13.073
表:再帰関数

Parallels Desktop for MacのゲストOS(Ubuntu)が、母艦のM1 Maxより7.4%遅いという結果に。

まとめ

処理M1 Max
(母艦)
Python 3.11.0
Ubuntu
on Parallels 18
Python 3.11.0
Ubuntu
on UTM
Python 3.11.0
forループ処理0.9450.8520.854
代入処理1.0710.9950.996
定数を使った四則演算1.1070.9660.977
変数を使った四則演算4.8324.3254.374
if文1.3451.2551.273
配列シーケンシャル2.11121.6622.431
配列ランダムRead3.06325.50523.621
配列ランダムWrite3.51413.55.802
ソート0.4090.4130.418
+による結合0.4640.2980.297
joinによる結合0.8350.6650.657
deque0.4050.3940.381
優先度付きキュー3.3263.7293.787
組み込み関数呼び出し0.7730.7370.731
再帰関数12.17413.07613.073

最後に

最後まで読んでいただきありがとうございます。今回のParallels上のUbuntu 22.10でPython 3.11.0のベンチマークをとってみるはいかがでしたでしょうか。母艦のM1 Maxより速い結果の項目もあり、そんなこともあるのか!という思いからまとめてみました。配列アクセス意外はゲストOSの方が速い!というのは意外でしたParallels Desktop for Macはすごい!ということがわかりました。参考になれば幸いです。

Parallels 19 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。Mac上で快適にUbuntuが動作します。

MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。

初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。

定番おすすめ記事

関連記事