Hy(Hylang)をCythonでコンパイル

Hythonコミュニティの id:rokujyouhitoma です。こんにちわ!

Hythonコミュニティ

Hythonコミュニティは不定期的でHython(廃村)-hack-a-thonと称して、廃村めぐりを開催しています。Pythonで知り合った人たちがほとんどです。

前回参加時は、たしか...猿島?の要塞跡を見学しました。それ廃村じゃ無いじゃん、廃墟じゃん。というツッコミはあるかと思います。
前々回は、奥多摩の廃村だったと記憶してます。山奥でさまよってやっとのこと住居跡を見つけたのですよ!

で?

さて、現在開催中のPython その2 Advent Calendar 2015でcsakatokuさんがHy記事で無双(?)してるのをみてHyに興味をもちました。

Hythonと語呂がちょうどあってそうだし、Pythonで書かれたLisp系処理系のHy(Hylang)を触らないのはもったいないかなー。

さて、前置きが長くなりましたがHythonコミュニティと全く関係ない、本題を...

HyをCythonでコンパイル

というわけでPythonで書かれたLisp処理系の1つHyについてです。

HyPythonで書かれてるので、Hyの処理系自体をCythonで*.soにすれば、速くなるかな?というのを試します。

環境

$ Python -V
Python 2.7.9
$ uname -s
Darwin

検証コード

実際にインストールしたい人は下記でインストール可能です。

cd <上記のリポジトリ(feature/cythonizeブランチ)>
pip install -e .

結果

Cythonizeは成功。作業時間はこの記事書くの含めて2h。実作業には1.5hくらい。

  • 単純な実行だと速度改善する。
  • ただし、本家Hyだとこけないテストが、自前のCythonize版ではそもそもエラー&コケる...。

単純なコード

例えば、map処理

オリジナルをCPythonで
time hy -c "(map inc [1 2 3])"
hy -c "(map inc [1 2 3])"  0.92s user 0.07s system 98% cpu 1.001 total
Cythonバージョン
$ time hy -c "(map inc [1 2 3])"
hy -c "(map inc [1 2 3])"  0.69s user 0.11s system 79% cpu 0.997 total
単純なコードでの結果

33%速度改善がみられた。Cythonのアノテーションなしで33%の改善なら悪くない。

オリジナをCPythonで Cythonバージョン
0.92s 0.69s 1.333

コケる

オリジナルをCPythonで

$ time make test
(省略)
Ran 419 tests in 57.520s

OK
make test  53.09s user 3.23s system 96% cpu 58.337 total
Cythonバージョン
$ time make test
(省略)
Ran 419 tests in 41.521s

FAILED (errors=1, failures=4)
make: *** [test] Error 1
make test  37.97s user 3.21s system 96% cpu 42.509 total
ERROR

Errorが1件。致命的。
うーん。not iteratableなオブジェクトが来てる...なぜ。

======================================================================
ERROR: NATIVE: test the iteration behavior of cons
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/rokujyouhitoma/.virtualenvs/cythonize-hy/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/rokujyouhitoma/.virtualenvs/cythonize-hy/lib/python2.7/site-packages/nose/util.py", line 620, in newfunc
    return func(*arg, **kw)
  File "/Users/rokujyouhitoma/workspace/github.com/hy/tests/native_tests/cons.hy", line 291, in test_cons_iteration
  File "hy/models/cons.py", line 85, in __iter__ (hy/models/cons.c:2403)
    for i in iterator:
  File "hy/models/cons.py", line 79, in genexpr (hy/models/cons.c:2186)
    iterator = (i for i in self.cdr)
  File "hy/models/cons.py", line 85, in __iter__ (hy/models/cons.c:2403)
    for i in iterator:
  File "hy/models/cons.py", line 79, in genexpr (hy/models/cons.c:2186)
    iterator = (i for i in self.cdr)
  File "hy/models/cons.py", line 85, in __iter__ (hy/models/cons.c:2403)
    for i in iterator:
  File "hy/models/cons.py", line 79, in genexpr (hy/models/cons.c:2186)
    iterator = (i for i in self.cdr)
  File "hy/models/cons.py", line 85, in __iter__ (hy/models/cons.c:2403)
    for i in iterator:
  File "hy/models/cons.py", line 79, in genexpr (hy/models/cons.c:2186)
    iterator = (i for i in self.cdr)
  File "hy/models/cons.py", line 85, in __iter__ (hy/models/cons.c:2403)
    for i in iterator:
  File "hy/models/cons.py", line 79, in genexpr (hy/models/cons.c:2156)
    iterator = (i for i in self.cdr)
TypeError: 'HyInteger' object is not iterable
FAIL

Failは4件。そこそこ致命的。

前半2つはkoanというマクロが起因でコケてる。
後半2つは、前半2つと同様koanか、ideasというマクロが起因でコケる。

======================================================================
FAIL: tests.test_bin.test_bin_hy_stdin
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/rokujyouhitoma/.virtualenvs/cythonize-hy/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/rokujyouhitoma/workspace/github.com/hy/tests/test_bin.py", line 60, in test_bin_hy_stdin
    assert "monk" in ret[1]
AssertionError: 
    (0, u'\x1b[?1034h=> => ', u'hy 0.11.0 using CPython(default) 2.7.9 on Darwin\n  File "<input>", line 1, column 1\n\n  (koan)\n  ^----^\nHyMacroExpansionError: expanding `koan\': <cyfunction koan_macro at 0x10311e1d0> is not a Python function\n\n\n') = run_cmd("hy", '(koan)')
    assert (0, u'\x1b[?1034h=> => ', u'hy 0.11.0 using CPython(default) 2.7.9 on Darwin\n  File "<input>", line 1, column 1\n\n  (koan)\n  ^----^\nHyMacroExpansionError: expanding `koan\': <cyfunction koan_macro at 0x10311e1d0> is not a Python function\n\n\n')[0] == 0
>>  assert "monk" in (0, u'\x1b[?1034h=> => ', u'hy 0.11.0 using CPython(default) 2.7.9 on Darwin\n  File "<input>", line 1, column 1\n\n  (koan)\n  ^----^\nHyMacroExpansionError: expanding `koan\': <cyfunction koan_macro at 0x10311e1d0> is not a Python function\n\n\n')[1]
    

======================================================================
FAIL: tests.test_bin.test_bin_hy_cmd
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/rokujyouhitoma/.virtualenvs/cythonize-hy/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/rokujyouhitoma/workspace/github.com/hy/tests/test_bin.py", line 65, in test_bin_hy_cmd
    assert ret[0] == 0
AssertionError: 
    (1, u'\x1b[?1034h', u'  File "<stdin>", line 1, column 1\n\n  (koan)\n  ^----^\nHyMacroExpansionError: expanding `koan\': <cyfunction koan_macro at 0x10311e1d0> is not a Python function\n\n') = run_cmd("hy -c \"(koan)\"")
>>  assert (1, u'\x1b[?1034h', u'  File "<stdin>", line 1, column 1\n\n  (koan)\n  ^----^\nHyMacroExpansionError: expanding `koan\': <cyfunction koan_macro at 0x10311e1d0> is not a Python function\n\n')[0] == 0
    assert "monk" in (1, u'\x1b[?1034h', u'  File "<stdin>", line 1, column 1\n\n  (koan)\n  ^----^\nHyMacroExpansionError: expanding `koan\': <cyfunction koan_macro at 0x10311e1d0> is not a Python function\n\n')[1]
    

======================================================================
FAIL: tests.test_bin.test_bin_hy_icmd
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/rokujyouhitoma/.virtualenvs/cythonize-hy/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/rokujyouhitoma/workspace/github.com/hy/tests/test_bin.py", line 78, in test_bin_hy_icmd
    assert "monk" in output
AssertionError: 
>>  assert "monk" in u'\x1b[?1034h=> => '
    assert "figlet" in u'\x1b[?1034h=> => '
    

======================================================================
FAIL: tests.test_bin.test_bin_hy_icmd_file
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/rokujyouhitoma/.virtualenvs/cythonize-hy/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/rokujyouhitoma/workspace/github.com/hy/tests/test_bin.py", line 87, in test_bin_hy_icmd_file
    assert "Hy!" in output
AssertionError: 
>>  assert "Hy!" in u'\x1b[?1034h=> => '

まとめ

  • Hyとっても面白い。コードを読み進めたい& Land of Lisp のコードをHyで書きたい。
  • 簡単にCythonでビルドできた。Cython有能。
  • ちょっと検証コードが少ないので、もう少し試そうかな。
  • PyPyでHyの速度は気になるから、PyPyでも試してみたい。

歴史探求のメモ書き

松浦党研究連合会の末席で活動している池です。メモ目的で記す。

読みたい

読みたいが、入手が困難な文献一覧。

志佐物語、志佐記は古い文献であるため、閲覧難易度が高いだろう...。

市史については、あと数十年以内に再度編纂されるであろう or 国会図書館や県図書館に行くか...。

松浦党研究 N.XXは、所属先発刊なので、なんとか入手できそうだし、そもそもアマゾンでまだ扱われてるから、入手は容易そう。
入手できないとしても国会図書館に蔵書されてるので閲覧難易度は低い。

入手難易度高

  • 志佐物語
  • 志佐記
  • 志佐二世物語
  • 松浦叢書第一巻

入手難易度低

ウェブ

なんと、ウェブ上で読めるという幸せ(真贋は不明)

人物

  • 吉村茂三郎

Pythonのマイナーな処理系、コンパイラ

今後深堀りして調査するかは未定だけど、名称忘れがちなのでindex目的で。

д゚)チラッ この分野に詳しい、 id:Ehren 先生からのコメントほしい&二段階ほど深堀りしてまとめてほしいなー

Pythonのマイナーな処理系一覧

マイナー

主観だがマイナーだと思ってる

  • Pythran
  • Parakeet
  • Nuitka
  • Shed Skin
  • HOPE
  • CLPython
  • Python for S60?

マイナーだけど...

下記は除外。既にある程度触った、調査した(and or 興味がない...)ため

  • Pyston(id:Ehren先生が追ってるのでレポート待ってる
  • Numba
  • Cython
  • Psyco
  • RPython
  • MicroPython
  • PyMite
  • tinyPy

メジャー

下記は除外。主観だがメジャーなため

うーん???

知らなさすぎて分類不能。

  • MyPy

最近やったこととか、次にやることを整理

ざっくりでもどこかにアウトプットしとかないと興味がガンガン移ったりするのと、頭からフラッシュしたいので。

やったこと

コード書いた

書いたというか、この前のjava-ja.ossの和田さんの発表を聞いて、継続的に書き始めた。
Cythonがだいぶ面白い。

「コード書いた」からはずれるけど

Emacsでjedi.elはPythonではよさげだった。

技術書

実践ドメイン駆動設計

実践ドメイン駆動設計

Learning NGUI for Unity

Learning NGUI for Unity

NGUI for Unity

NGUI for Unity

ゲームを動かす数学・物理

ゲームを動かす数学・物理

改訂3版 パーフェクトC#

改訂3版 パーフェクトC#

[asin:4873117313:detail]

歴史の基礎力向上

豊後国風土記・肥前国風土記

豊後国風土記・肥前国風土記

やれなかったこと

TODO、Keep

コードを書く

具体的には、通信周り、オブジェクトの物理挙動を学習用途で。C苦手なのでC or Cythonで。
「コード書く」から外れるけど、macの/usr/include/*.hを読んだことなかったのでCythonで遊びながら読む。
mrubyとかCythonで組み込むと面白いのかな。

技術書

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

直系ご先祖の戸籍取寄せ

保管期間150年というのが定められてるから、古いのどんどん追えなくなるので。
行政書士司法書士に頼むか、自力で取り寄せるかは未決。

IPAの情報処理資格

トライしよう。知人が受けた姿勢を真似て

NLP

...oh...アウトオブレンジだった...のを整理してて思い出したでござる

放送大学 自然言語処理('15)

放送大学自然言語処理NLP)の講義を今年から配信すると聞いた。2月ごろ。

以前から興味があった&業務でちょびっとかじったNLP。面白そうだったので、単位取得までしてみるか。ということで、放送大学 自然言語処理('15)を科目履修生として履修しました。

受講した理由は、ネット(たしかTwitterだったような...)で知って、座学を体系だってインプットしてみるか思い立ったため。業務でちょびっとかじったことあるのも関係していると思う。

受講したいけど、悩んでるって人がいたら、コメント欄やツイッターなどで連絡取ってみてください。詳細答えます。記事へのツッコミも歓迎。

結論・結果

  • 無事単位取得。
  • すっごい楽しかった。
    • 客員として京大黒橋教授の講義がラジオ配信で受けられるとかラッキーだった。
  • 体系通り基礎を学ぶことができた。
  • コストは18,000円と諸経費α(学生証の写真代とか)
    • 実際には書籍に5万くらい突っ込んだ。
  • 期間は3月から準備に入って、8月まで。主に毎週6時間程度。土日の夜の時間。

前提

スキルの説明したほうが良さそうなので以下箇条書き。 基本学ぶことに苦はない。

スキル

基本、高卒程度だと思ってもらってよい。

数学

近年、下記を仕事で必要になってるのでとりわけ学んでる。

  • 微分積分学
    • 高校程度で止まってる。
  • 線型代数
    • とりわけゲームクライアントの座標系で使うから必要。
    • 多分2015下期で履修してみる。
  • 離散数学

専門知識

  • NLP

    • Baidu JapanでちょっとだけNLPの世界に触れた。
    • 興味はある。
    • 周囲は、検索エンジン各社でNLP触ってた人たちに恵まれてる/てた。
  • プログラミング

    • 仕事がソフトウェア開発なのと、プログラミング言語好きなので、言語変わってもなんとかなるくらいのスキルは持ってる。

学習戦略

  • 数。とにかく数をインプット。
  • それでもわからなければ数。とにかく文献漁って数をインプット。
  • 困ったらNLP修士取った知人や、検索エンジン作ってた知人に相談。

放送大学

本題の放送大学 自然言語処理('15)について。

科目履修生

放送大学のネットから申請可能。半期のみ在学可能。 入学料は7,000円。1科目ごとに授業料として11,000円。

つまり、今回は自然言語処理('15)のみなので、合計18,000円なり。

自然言語処理('15)

放送大学 授業科目案内 自然言語処理('15)

講義

基本的には座学。途中で4者択一の課題が10問程度あるので、郵送で提出。ネット提出も対応していた。

自然言語処理('15) 第15回の最終回

ゲストは、最終回にふさわしく京都大学長尾真名誉教授。

単位取得試験

1.5h。僕の場合は渋谷の受験センターで受験。

単位取得試験の結果

無事単位習得。2単位。

専門書籍に困ったら

  1. 大学図書館
  2. 国立国会図書館...
  3. アマゾンなどのECサイトで購入
  4. 専門書店

専門書店

水道橋-神保町に繰り出す。

情報源

NLP学習の情報源。

既に追ってる情報源

NLPを学ぶ上で何回も見なおしたサイト。

首都大学東京小町研

この1,2年でガンガン更新されてるので目を通すのが吉。

武蔵野日記

今後追ってく情報源

NAIST松本研

参考にする。 - Introduction to Computational Linguistics Laboratory - 松本研でやっている勉強会の説明

NLP若手の会(YANS)

言語処理学会

研究室

NLPを学ぶ上で、よくみかける大学の研究室、研究者。 見かけた場所はネットや、書籍。

実際研究者の論文総ざらいとかする気が本気であるなら、「デジタル言語処理学事典」の編集委員・執筆者一覧を参考にすればOK

最後に

楽しかったので、15年度下期の別の講義を申し込んだ。

CEDEC 2015の予定

来週の週後半からCEDEC2015が開催されるのだけど、その予定を。

なお、所属してるITAKOの業務の一貫として参加予定。

書き出してみてわかったけど、だいぶ数多いので枝刈り必要。そして、タイムテーブルの被りは未考慮。

興味あるセッション

その他

知人

積極的に捕えるm9

知人以外

同じ業界人として話掛けて情報交換する。よろしくお願いしますm(_)m

懇親会

YAuthが通らない...

PyConJP2015で聴きたいセッションとか

追記(2015/7/31)

まだ、投票完了してないらしく、Twitter/Facebookにシェアすると投票したことになるらしいです。
僕が列挙したトークセッションに興味ある人いたら、投票願います。


さて....

PyConJP2015のセッションは投票期間中で、まだ確定じゃない(らしい?)けど、まとめとく。

超楽しみ

最近、興味あるのはCython。個人のツールをcython --embedでコンパイルして作ったりして遊んでるので興味あり。

総括

  • ゲーム系、コンパイラ・言語処理系がない(or 少ない?)のは残念。あともっと地球科学とかの学者が使ってるって聞いてるので、まったく未知の分野なので発表してほしいな|д゚)チラッ
  • pandasはすごい多い!枝刈り枝刈り
  • 初級は充実してるけど、中級、上級が足りないので、増えればいいなー。と思ったりした