Python vs Java(超個人的な比較)
記事内容
この記事は、ぼくの浅いプログラミング知識で、java とpythonについて比較した個人的な感想です。以下の構成でお届けします。
- 言語の特徴
- 処理能力
- 汎用性
- 難易度(学習コスト)
- 総評
言語の特徴
python
ここ最近、ディープラーニング、機械学習といった言葉をよく耳にするのではないでしょうか。GoogleのDeepMind社が開発したAlphaGoが囲碁のトップ棋士と勝負して好成績を収めたニュースが話題になりました。pythonではこのDeepMind社が開発したTensorFlowなど数多くのライブラリを無償で使用することができます。
科学計算の分野では、MATLABが有名ですが近年では、pythonがそれを超えるような存在になっています。
NumpyやSciPy,pandasなど便利なライブラリやツール群が整備されていることが人気の理由のひとつと考えます。言語の設計は非常にスマートで、簡潔で理解し易いものです。これは、開発における生産性を高めるうえで大きなメリットとなります。
このようにpythonは、ビッグデータ解析やディープラーニング、スクレイピング・クローリングなど豊富なライブラリを使うことで柔軟なプログラムが書けます。
java
みなさんが業務で使うシステムやAndroidアプリなどの多くはjavaでプログラムすることができます。web製作やゲーム、大規模システムなど用途に縛られません。人気の高い言語ですから、外部ライブラリも充実しています。
また、実行にはコンパイルを必要とするため、スクリプト型言語より処理速度が高速です。
もうひとつ大きな特徴として、プラットホームに依存しません。AndroidやOSX、windowsなどの環境で動作するプログラムが作成できます。これが、人気の要因として大きいのではないでしょうか。
処理能力
様々な言語の処理能力については、たくさんの議論が行われています。一般的にはスクリプト型言語よりコンパイル型言語の方が処理は高速であるとされています。記述言語をコンピューターが実行できるようにするためには、機械語に変換する必要があります。処理の速さはこの仕組みがどうであるかに依存します。
それでは、どれくらい違うのでしょうか?
テストとして適切かわかりませんが単純な計算処理で比較してみます。
Pyhon
import numpy as np
import time
def calctest2():
start = time.time()
for i in range(1000000):
ans = i * i ** 2 - i
result = np.tan(ans)
elapsed_time = (time.time() - start) * 1000
print("result:{}" .format(result))
print("elapsed_time:{0}".format(elapsed_time) + "[ms]")
出力結果
result:-0.19688668049725247
elapsed_time:1129.000186920166[ms]
public class main {
public static void main(String[] args) {
double ans = 0;
double result = 0;
long start = System.currentTimeMillis();
for(int i =0; i < 1000000; i++) {
ans= i * Math.pow(i, 2) - i;
result = Math.tan(ans);
}
long end = System.currentTimeMillis();
System.out.println("result:" + result);
System.out.println("elapsed_time:" + (end - start) + "[ms]");
}
出力結果
result:-0.19688668049725247
elapsed_time:461[ms]
計算部分の処理時間を計測した結果、javaの方が約2.5倍速い結果となりました。なお、for文内にprint文を挟むとpythonで6341[ms]、javaで5876[ms]で大きな差はでませんでした。
当たり前ですが、どちらも使う標準APIや外部ライブラリなどが処理能力に影響を与えます。ここでは検証しませんが、pythonではnumdaを利用するこでさらに高速化を図ることも可能だそうです。これらの事から通常の計算能力だけみた場合には、コンパイル型言語の方が速い結果となります。しかしアプリケーションで見た場合には使う言語によって適切な設計がなされていれば能力はあまり関係ないのではないでしょうか。
汎用性
pythonで多く作られているものはWebサービスです。代表的なものでは「DropBox」、「Instagram」があげられます。また、デスクトップアプリケーションから組み込み系まで幅広く活用される言語です。近年ビッグデータ解析や機械学習といった分野においてもpythonが注目を集めています。このことから、将来性の高い言語です。ライブラリが豊富に整備されているため、ほとんどのことはプログラムできるでしょう。
次にjavaについてです。目にするほとんどのプログラムはjavaでプログラム可能です。オブジェクト指向プログラミングによって堅牢で安全な設計ができ、保守管理に優れたプログラムが作成できます。このため、大規模システムなどでもjavaが活躍しています。汎用性で特筆すべきはプラットホームに依存しないことです。javaはjvm(java仮想環境)がある環境下であればプラットホーム問わずに動作します。これによって利用ステージは他の言語に比べ格段に広いといえます。このことが、いまだ言語別人気ランキングの上位にjavaが君臨する要因と考えます。
難易度
ぼくは、基本的に勉強するときは書籍を買い漁ります。先ず通読してなんとなくの内容を把握する程度で、あとは実際書いている時に辞書として使う方法で勉強しています。
日曜プログラマーなので、週末こつこつ時間をつくっては書いています。
ぼくは、pythonが初めての言語でした。文法基礎を理解するのに二ヶ月、そこからnumpyなどの数値計算方法からmatplotlibのチャート、そしてguiのwxpythonまでやり、ひとつguiプログラムが作れるようになるまでプラス二ヶ月くらいです。
最初はclassの使い方や数値のやりとりもよくわからず、よく寄り道YouTubeしていました。
今やGoogle先生に聞けば大抵の事はでてきます。英語サイトも見る必要がでてきますが、理解するというより、感じろ!です。言語は世界共通です。
次に言語仕様についてぼくの率直な感想は、pythonは読みやすく理解しやすい、一方javaは厳密で初めて学ぶにはとっつきにくいという印象です。
同じものを作るにしてもpythonは記述量が少なく短期にプログラムが作成できます。
例えばjavaでは変数やインスタンスの型宣言が重要です。これによって確実なインスタンスを保つことができます。
しかし、pythonでは型宣言はなく、代入したものを内部判定して情報を保持します。これによって書きやすい反面、大規模である場合しっかり定義しておく必要があります。
このように、javaは決まり事が多いためぼくのようにpythonからjavaへとたどった人間としては、慣れるのに時間がかかりました。
ただ、プログラミングの基本的流れを理解してしまえばどの言語においても書き方の問題だけじゃないかなと思います。
もし知人がプログラミングに興味あってやってみたいとのことであれば、ぼくはpythonをおススメします。
総評
ぼくは仕事上において設計時に使用する計算プログラムを作ることが多いです。
その観点でみると、数学的な計算処理を書く場合、pythonはとても優れていて直感的に書けます。特にnumpyとmatplotlib,pandasは優秀で手放せません。結果をファイル出力する場合においても、多くのライブラリのおかげで選択の幅が広がります。javaを始めたとき、とくにこの辺のギャップを感じました。
javaにも数学系やチャート関係の外部ライブラリはあるらしいのですが、よくわかりません。便利なライブラリがあればどなたか教えて下さい!
みなさん自分が頑張って組んだプログラムを共有したい場合には、GUIをもったプログラムにして配布したいって思いませんか?
まぁ用途によりますが。。
pythonではguiをwxpythonで作っていましたが、計算ロジックの部分よりguiをプログラムする方が時間がかかっていました。他にもQtなどもありますがライセンスの関係で使っていません。javaではjavaFXが標準としてあります。見た目も綺麗で、builderと併せると効率よく書けます。また、FXMLというファイルにGUI記述部分とコントロール部分を分離できるのでスッキリしたプログラムとなります。
つぎに、配布用アプリの書出しについて少し書きたいと思います。pythonのプログラムでguiでグラフなんかも表示する機能のプログラムを書きだす場合、pyinstallerを使用していました。書き出したファイルサイズは数百メガになります。実行速度も遅い印象です。
ぼくの場合これがjavaをやってみようと思うきっかけでした。同じようなプログラムを出力した場合javaでは10メガ以下です。動作も高速です。
以上のように現状は、ぼくのなかで計算ライブラリ以外はjavaに軍配があがります。コード量を差し引いてもjavaです。ただ、pythonの開発速度にはかなわないでしょう。
どちらも、使う用途によるといえばそれまでですが、ぼくの場合は、
- 実行速度
- Gui
- 汎用性
の3要素が重要だったということです。
読んでくれたみなさま、ありがとうございます!
javafxで水理計算プログラム
梅雨があけましたね!
暑い夏はひきこもってプログラミングだ!
ということで!まずはじめにお断りしておきます。
Qiita並みの情報は皆無です。たぶん
ぼくは、Pythonを1年程趣味でプログラミングしていました。
- 有限要素法による構造計算
- 水理計算プログラム
- 点群断面計算
- 点群座標変換
- T型擁壁構造計算
- etc…
これをみて、ぼくの職業は大体察しがつくでしょう。
業務上こんなソフトがほしいと思ったものを作っています。プロじゃありませんが、情熱をもってつくってます。
現在は、pythonもたまにやりつつjavaを猛勉強中です!
はやく習得するため、pythonで作ったものをjavaで書き直そうと思い、第一段として水理計算プログラムをチョイスしました。
先ずこのプログラムの概要を紹介します。
ある対象地に降る雨水に対して、浸透施設を設置します。この処理能力について施設評価することを目的としたプログラムです。
その他に付加する主な機能はこんな感じです。
- 長野県の降雨強度式に対応させる。
- Userが手動で降雨量を入力できる。
- Guiプログム
- UserデータlO処理
- 施設検討グラフツール
- 帳票出力
Pythonでは、2 and 5の機能はありません。また、帳票出力については予めテンプレートTeXを書いておき、それをpythonで読み込み文字列処理、そしてバッチファイルでコンパイルという形をとっていました。
みなさんこういった帳票についてどうしてるのかな?
余談ですが、はじめはsphinxを使ってましたが細かな修正ができないこと、帳票としての見た目、そしてバッチ処理がいまいちわからなかったというのがあります。(pythonプロンプト)
現在はめぐりにめぐって見た目も美しいtexを使ってます。
しかし、texも環境がないところへ持っていったときにはコンパイルできません。
そのため何かいい方法がないものかと、リサーチしてる中で、Javaではjasper reportがよさそうでした。
したがってこのプログラムの帳票候補にします。
次に計算ロジックに使う引数です。
List<Double> A;//流域面積
List<Double> f;//流出係数
double rain;//降雨量(手動入力)
String tiiki;//長野県(地域区分)
String kakuritu;//長野県(降雨確率年)
int time;//流達時間
double ko;//飽和透水係数
String type;//施設type
計算ロジックはこれだけの条件でまわります。
ぶっちゃけエクセルでも簡単に作れます。
恐らくオフィス系ライブラリを使えば帳票も作成できるでしょう。
では、わざわざ時間をかけて何故javaで作るのだ?!って思うひともいるでしょう。
確かにエクセル使える人は、おじさん達に好かれ重宝されます。仕事の仕様もオフィス系のものがほとんどです。
しかし、エレガントじゃあない!!
意味わかりませんかぁ?
ぼくもわかりません。
なんというか、何かひっかかるものがあります。
使ってはいけない!という心の奥底できこえるのです!
まぁわかる人にはわかるはず!
そんなこんなで(どんなだ!)
pythonで作ったものを、よりかっこよく!
より機能性をもったプログラムで生まれ変わらせるため日々楽しんで書いてます。
現状グラフツールと帳票が未実装です。
そのほかはエラー処理以外見通しがたってきました。
またの機会に断片的に紹介したいと考えてます。