インプルの井上です。本日はPythonの個人的弱点5選をご紹介いたします。
弱点が分かればどこに気をつけるべきか、どういうシーンに向かないのかが分かるかと思います。
弱点
型が弱い
Pythonは動的型付け言語です。「型」についての説明は以下のリンクをご参考ください。
参考リンク:https://qiita.com/toryuneko/items/c023031b61886cae2a99
動的型付け言語だと、コード実装時には変数の型が決まっておらず、コード実行時に変数の型が動的に
決まります。明示的にデータの型指定をしなくて良いので、コードの記述量が減る・比較的簡単に
プログラムが書けるなどのメリットもありますが、コード実行時まで型がわからないというのは
意図しないエラー(バグ)を生み出しやすいです。例えば整数(int)型のデータを足し算する
関数(add_value)でサンプルコードを書いたので参考にしてください。
サンプルコード
def add_value(a, b):
print(f"{a + b}円")
# 正しい型
x = 1000 # 整数型
y = 500 # 整数型
add_value(x,y)
>> 1500円
# 正しくない型
x = "1000" # 文字列型
y = "500" # 文字列型
add_value(x,y)
>> 1000500円 # バグとなる!!
Pythonにはタイプアノテーションという引数に型を記述する型ヒントという機能があります。
def add_value(a: int, b: int):
print(f"{a + b}円")
ですが、タイプアノテーションには型の強制能力は無くあくまで注釈・説明文でしかありません。
ですので、引数の型を強制させたい場合は関数内にif文・assert文を書くか、型チェック用のライブラリ
mypyを使うと良いでしょう。
処理速度が遅い
Pythonはインタープリタ言語といってスクリプト実行時に1行1行コードを解析しながら実行
していく言語です。一方でコンパイラ言語という実行前にコードを解析して機械語翻訳された
ファイルを作成する言語(例:C、C++など)もあります。
簡単なコードだったり、少しのデータしか扱っていないスクリプトの場合はそこまで気にならないかも
しれませんが、一般的にPythonはC、C++の10倍処理速度が遅いと言われています。
結果処理速度が遅いことで以下のことが言えます。
リアルタイム性が重要なアプリケーションの開発に向かない(web会議やテレビゲームなど)
並列処理に不向き
並列処理とは複数の処理を同時に行うことです。並列処理の実装法は主に以下の2つになります。
- マルチスレッド
- マルチプロセス
マルチスレッド
Pythonのマルチスレッドはthreadingという標準ライブラリを使用して実装するのですが、
実は並列処理ではなく並行処理のみしかできません、以下参考画像を添付します。
並行処理の場合、IO操作(例:ファイル読み込み処理)がボトルネックなら比較的有効なのですが、
CPUの処理がボトルネックになっている(大量の数値計算をしたい)場合、並行処理では
あまり速度がでません。
マルチプロセス
Pythonのマルチプロセスはmultiprocessingという標準ライブラリを使用して実装します。
Pythonのマルチプロセスではプロセス間のデータの共有ができないため、1つのデータに
対しての並列処理ができません。またプロセス間のデータの共有コードを書くこともできますが、
コードは複雑で安全に書くのが大変です。そして何より、マルチプロセスはメモリーの消費量が多い
という特徴があり、Pythonでマルチプロセスのコードを使用していると、メモリーエラーで処理が
落ちることも考えられるのでPythonでの並列処理の実装はあまり向きません。
モバイル開発に向かない
Pythonはそもそもモバイル開発用に作られた言語ではございません。
kivyというPythonからAndroid・iOSアプリを作れるライブラリはあるのですが、
モバイルプラットフォーム独自の機能が使えないなどの制約があります。
ですので、本格的なモバイルアプリを作りたい場合はAndroidであればKotlin、iOSであればSwiftで
作った方が環境も良くよりリッチなアプリケーションを作成することができます。
多くが手続き型で書かれている
Pythonはマルチパラダイム言語とされています、マルチパラダイム言語とはオブジェクト指向、
関数型、手続き型など色々な書き方ができる言語のことを指します。
ですが、実際は以下のような実態があるようです。
- 関数型でも書けるが純粋な関数型言語のように書くことができない
- オブジェクト指向でも書けるが純粋なオブジェクト指向言語のように書くことができない
上記からPythonは手続き型で書かれることが多いようです。
手続き型とは1行1行命令を上から順番に書く書き方です、手続き型は処理の抽象度が低く簡単に
書ける反面、コードの綺麗さと安全性が損なわれやすい側面があります。
一見器用貧乏にも見えますが、マルチパラダイム(様々な思想)を取り込んでいるのでPython1つで
様々な思想を学習できるとも考えられます。
最後に
いかがだったでしょうか?ひとえに弱点といってもその言語を批判しているわけでは決して
ございません。Pythonには豊富なライブラリを軸にしたデータ分析やデータ処理、機械学習などが得意
だという側面も持ちます。それぞれの言語の強み・弱みを把握することで目的に対し適切な言語を
選択することができるようになると思います。この記事をきっかけに各言語の強み・弱みを把握し、
楽しい開発ライフをお過ごしください。