「Pystonを検証したいけど、ビルドとか嫌すぎる・・・」
「なんとかPythonの速度を改善したい」
このような人には、この記事を読んで欲しいです。
この記事を読めば、Pystonを気軽に検証できるようになります。
本記事の内容
- Pystonとは?
- Pystonのシステム要件
- Pystonのインストール
- Pystonの動作確認
それでは、上記に沿って解説していきます。
Pystonとは?
Pystonとは、Pythonを高速化したモノです。
Dropboxにより、オープンソースとして開発されています。
最新のPystonは、Python 3.8.8をベースにしています。
そして、PystonではPythonのコードをそのまま利用できます。
それでありながら、パフォーマンスが30%向上するということです。
状況によっては、さらにその数値は上昇すると言われています。
これが本当なら、使わない手はありません。
Pystonの開発者も「是非、使ってほしい」と述べています。
以上、Pystonに関する説明でした。
次は、Pystonのシステム要件を確認します。
Pystonのシステム要件
現時点(2021年8月)でのPystonの最新バージョンは、2.3となります。
この最新バージョンは、2021年7月17日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応かどうかは不明です。
どこにも明示されていません。
- Windows
- macOS
- Linux
ソースが公開されている以上、ビルドできればどこでも動くはずです。
ただ、現状はLinux・macOSにインストールするのが無難でしょうね。
そして、ビルドするために必要なライブラリが以下。
- build-essential
- ninja-build
- git
- cmake
- clang
- libssl-dev
- libsqlite3-dev
- luajit
- python3.8
- zlib1g-dev
- virtualenv
- libjpeg-dev
- linux-tools-common
- linux-tools-generic
- linux-tools-`uname -r`(OS毎に異なる)
ビルドする場合は、インストールしておく必要があります。
ビルドでインストールする場合は、公式の手順通りにやってください。
なお、今回はビルドをしません。
よって、上記を事前にインストールする必要もありません。
debパッケージをインストールする方法を採用しています。
そして、OSはUbuntuに限定しています。
以上、Pystonのシステム要件の説明でした。
次は、Pystonをインストールしていきます。
Pystonのインストール
公式ダウンロードページ(GitHub)
https://github.com/pyston/pyston/releases
上記にアクセスします。
Pyston 2.3からdebパッケージが用意されています。
今回は、次のバージョンのUbuntuにインストールします。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
よって、「pyston_2.3_20.04.deb」を選択します。
URLを調べて、wgetでダウンロードします。
$ wget https://github.com/pyston/pyston/releases/download/v2.3/pyston_2.3_20.04.deb
ダウンロードしたdebパッケージをdpkg ユーティリティーでインストールします。
$ sudo dpkg -i pyston_2.3_20.04.deb
実行すると、以下のようにエラーが出ました。
$ sudo dpkg -i pyston_2.3_20.04.deb 以前に未選択のパッケージ pyston を選択しています。 (データベースを読み込んでいます ... 現在 94428 個のファイルとディレクトリがインストールされています。) pyston_2.3_20.04.deb を展開する準備をしています ... pyston (2.3) を展開しています... dpkg: 依存関係の問題により pyston の設定ができません: pyston は以下に依存 (depends) します: libtcl8.6 (>= 8.6.0) ...しかし: パッケージ libtcl8.6 はまだインストールされていません。 pyston は以下に依存 (depends) します: libtk8.6 (>= 8.6.0) ...しかし: パッケージ libtk8.6 はまだインストールされていません。 pyston は以下に依存 (depends) します: tk8.6-blt2.5 (>= 2.5.3) ...しかし: パッケージ tk8.6-blt2.5 はまだインストールされていません。 dpkg: パッケージ pyston の処理中にエラーが発生しました (--install): 依存関係の問題 - 設定を見送ります libc-bin (2.31-0ubuntu9.2) のトリガを処理しています ... 処理中にエラーが発生しました: pyston
足りないライブラリがあるようです。
それをインストールしてみます。
$ sudo apt-get update -y $ sudo apt-get install -y libtcl8.6
ここでも、エラーが出ました。
$ sudo apt-get install -y libtcl8.6 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。 以下のパッケージには満たせない依存関係があります: pyston : 依存: libtk8.6 (>= 8.6.0) しかし、インストールされようとしていません 依存: tk8.6-blt2.5 (>= 2.5.3) しかし、インストールされようとしていません E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)。
ここは、指示通りに「apt –fix-broken install」を実行。
$ sudo apt --fix-broken install パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 依存関係を解決しています ... 完了 以下の追加パッケージがインストールされます: fontconfig-config fonts-dejavu-core libfontconfig1 libtcl8.6 libtk8.6 libxft2 libxrender1 libxss1 tk8.6-blt2.5 x11-common 提案パッケージ: tcl8.6 tk8.6 blt-demo 以下のパッケージが新たにインストールされます: fontconfig-config fonts-dejavu-core libfontconfig1 libtcl8.6 libtk8.6 libxft2 libxrender1 libxss1 tk8.6-blt2.5 x11-common アップグレード: 0 個、新規インストール: 10 個、削除: 0 個、保留: 0 個。 1 個のパッケージが完全にインストールまたは削除されていません。 3,460 kB のアーカイブを取得する必要があります。 この操作後に追加で 12.6 MB のディスク容量が消費されます。 続行しますか? [Y/n]
アップグレードがあれば、既存環境に影響を及ぼす可能性があります。
しかし、今回はすべて「新規インストール」となっています。
したがって、何も躊躇せずに「Y」をEnter。
処理が終わったら、再度debパッケージのインストールを実行します。
$ sudo dpkg -i pyston_2.3_20.04.deb (データベースを読み込んでいます ... 現在 98385 個のファイルとディレクトリがインストールされています。) pyston_2.3_20.04.deb を展開する準備をしています ... pyston (2.3) で (2.3 に) 上書き展開しています ... pyston (2.3) を設定しています ... libc-bin (2.31-0ubuntu9.2) のトリガを処理しています ...
無事に終了したようです。
以上、Pystonのインストールについて説明しました。
次は、Pystonの動作確認を行います。
Pystonの動作確認
pystonコマンドが利用できるようになっています。
pystonコマンドを用いて、動作確認を行います。
まずは、バージョン確認です。
$ pyston -V Python 3.8.8 (heads/2.3_release:4b9a88fc50, Jul 8 2021, 15:46:12) [Pyston 2.3.0, GCC 9.3.0]
Pystonのベースは、Python 3.8.8です。
そして、インストールしたのはPyston 2.3となります。
これらのことが、上記の結果で確認できます。
次は、ヘルプを確認しておきます。
$ pyston -h usage: pyston [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): -b : issue warnings about str(bytes_instance), str(bytearray_instance) and comparing bytes/bytearray with str. (-bb: issue errors) -B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x -c cmd : program passed in as string (terminates option list) -d : debug output from parser; also PYTHONDEBUG=x -E : ignore PYTHON* environment variables (such as PYTHONPATH) -h : print this help message and exit (also --help) -i : inspect interactively after running script; forces a prompt even if stdin does not appear to be a terminal; also PYTHONINSPECT=x -I : isolate Python from the user's environment (implies -E and -s) -m mod : run library module as a script (terminates option list) -O : remove assert and __debug__-dependent statements; add .opt-1 before .pyc extension; also PYTHONOPTIMIZE=x -OO : do -O changes and also discard docstrings; add .opt-2 before .pyc extension -q : don't print version and copyright messages on interactive startup -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE -S : don't imply 'import site' on initialization -u : force the stdout and stderr streams to be unbuffered; this option has no effect on stdin; also PYTHONUNBUFFERED=x -v : verbose (trace import statements); also PYTHONVERBOSE=x can be supplied multiple times to increase verbosity -V : print the Python version number and exit (also --version) when given twice, print more information about the build -W arg : warning control; arg is action:message:category:module:lineno also PYTHONWARNINGS=arg -x : skip first line of source, allowing use of non-Unix forms of #!cmd -X opt : set implementation-specific option. The following options are available: -X faulthandler: enable faulthandler -X showrefcount: output the total reference count and number of used memory blocks when the program finishes or after each statement in the interactive interpreter. This only works on debug builds -X tracemalloc: start tracing Python memory allocations using the tracemalloc module. By default, only the most recent frame is stored in a traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a traceback limit of NFRAME frames -X showalloccount: output the total count of allocated objects for each type when the program finishes. This only works when Python was built with COUNT_ALLOCS defined -X importtime: show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded application. Typical usage is python3 -X importtime -c 'import asyncio' -X dev: enable CPython's "development mode", introducing additional runtime checks which are too expensive to be enabled by default. Effect of the developer mode: * Add default warning filter, as -W default * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function * Enable the faulthandler module to dump the Python traceback on a crash * Enable asyncio debug mode * Set the dev_mode attribute of sys.flags to True * io.IOBase destructor logs close() exceptions -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would otherwise activate automatically) -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the given directory instead of to the code tree --check-hash-based-pycs always|default|never: control how Python invalidates hash-based .pyc files file : program read from script file - : program read from stdin (default; interactive mode if a tty) arg ...: arguments passed to program in sys.argv[1:] Other environment variables: PYTHONSTARTUP: file executed on interactive startup (no default) PYTHONPATH : ':'-separated list of directories prefixed to the default module search path. The result is sys.path. PYTHONHOME : alternate <prefix> directory (or <prefix>:<exec_prefix>). The default module search path uses <prefix>/lib/pythonX.X. PYTHONCASEOK : ignore case in 'import' statements (Windows). PYTHONUTF8: if set to 1, enable the UTF-8 mode. PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr. PYTHONFAULTHANDLER: dump the Python traceback on fatal errors. PYTHONHASHSEED: if this variable is set to 'random', a random value is used to seed the hashes of str and bytes objects. It can also be set to an integer in the range [0,4294967295] to get hash values with a predictable seed. PYTHONMALLOC: set the Python memory allocators and/or install debug hooks on Python memory allocators. Use PYTHONMALLOC=debug to install debug hooks. PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of locale coercion and locale compatibility warnings on stderr. PYTHONBREAKPOINT: if this variable is set to 0, it disables the default debugger. It can be set to the callable of your debugger of choice. PYTHONDEVMODE: enable the development mode. PYTHONPYCACHEPREFIX: root directory for bytecode cache (pyc) files.
最後は、Pythonスクリプトを実行しましょう。
次のコードを用意します。
実行しているPythonのバージョンを表示するプログラムです。
test.py
import sys print(sys.version)
test.pyを実行します。
実行は、pythonコマンドと同じ形式です。
pyston スクリプト名.py
実行した結果は、以下。
$ pyston test.py 3.8.8 (heads/2.3_release:4b9a88fc50, Jul 8 2021, 15:46:12) [Pyston 2.3.0, GCC 9.3.0]
「pyston -V」の実行結果と、全く同じ結果です。
何も難しくはありませんね。
以上、Pystonの動作確認を説明しました。