Cythonに入門した

python が遅すぎるのでcythonに入門した。

cythonでコードを書き直すときは、まずボトルネックになっている関数をcProfileとかで突き止めてから、jupyter notebook上で作業するのが効率的だと思う。

jupyter notebook上で

%load_ext Cython
%%cython -a

を打ってセルを実行するとヒントを表示することができる。

setuptoolsとの連携も非常に簡単で、setup.pyにext_modulesとcmdclassを書き足すだけでよい(setup.cfgを使っている場合も同じ)。

自作パッケージでのsetup.pyの例: github.com

Travis CIを走らせる前に試したい時とかは

python setup.py build_ext --inplace

コンパイルできる。

cython.readthedocs.io

blog.ymyzk.com

yutori-datascience.hatenablog.com

タイムアウトを設定してJoblibで並列処理を実行

pythonで並列処理をするときにはjoblibが手軽で便利だが、タイムアウト時の処理に自由度がない。 というのも、joblib.Parallelの引数にtimeoutを設定すると、指定した時間を超えたときに例外を投げて計算全体を止めてくれるが、タイムアウトした処理を無視して計算を継続するようなことはしてくれない。

joblib.readthedocs.io

pythonで自作関数にタイムアウトを設定するパッケージだとtimeout-decoratorが有名だが、multithreadingにも対応しているようだ。 なのでjoblib.Parallelのbackendをthreadingにすれば並列処理でtimeout-decoratorを使うことができる。

github.com

joblib.Parallelのbackendをデフォルトからmultithreading にすると(GILのせいで)計算時間が伸びることが多いけど、タイムアウトの処理ができずに永遠に計算が終わらないよりはマシだということにしておこう。 gist.github.com

pymatgenでのcifファイルの読み込み

pymatgenでcifファイルを読み込むにはpymatgen.io.cif.CifParserを使うが、たまに失敗することがある。

これはcifに書かれているfractional coordinates の精度が低いと、対称操作を施して同じワイコフ位置にある原子の座標を計算する部分がうまくいかないことがあるため。

特にtrigonal, hexagonalが失敗しやすい気がする。

現状の解決法としては、CifParserのsite_toleranceをデフォルトの1e-4から徐々に小さくしていくしかなさそう。

cifに記載されているwyckoff letter の情報からもう少し頑張れる気がするので考えてみる。

pythonのコマンドラインオプション

出力をバッファせずにnohup.outに掃き出す

nohup python -u hoge.py &

python - Nohup is not writing log to output file - Stack Overflow

warningsを無視する

python -W ignore hoge.py

How to disable python warnings - Stack Overflow

assertionをスキップする

python -O hoge.py

1. Command line and environment — Python 3.7.3 documentation

pythonで独自クラスにsetを使う

pythonで独自クラスに対してsetを使うには、そのクラスがhashableでなければならない。

hashableであるとは、__hash__()メソッドと__eq__()メソッドを持っていることを指す。

組み込み型 — Python 3.7.3 ドキュメント

python - How to implement __eq__ for set inclusion test? - Stack Overflow

[Python] 独自クラスをSetやDictのキーで使えるように、ハッシュ対応する - YoheiM .NET

ポリアの数え上げ定理の実装

最近ポリアの数え上げ定理の実装が欲しい場面に遭遇したのでlatexでメモを取りつつちまちま勉強していた。

↓はその時のメモ(証明は基本的に書いてない)。

ポリアの定理はある対称性のもとに色塗りをする場合の数を与えるものだが、その拡張として

  • 色塗りの固定部分群が与えられた群と共役であるような色塗りの場合の数(White's lemma)
  • 色を入れ替えて同じになる色塗りを同一視したときの数え上げ(De Bruijn)

などがあるようだ(こちらもそのうち勉強したい)。

さて、実装だが全通りを調べる場合は単に数式をそのままコードにすればいい。 問題は(例えば4箇所を青1赤3で塗るみたいに)使う色の数を固定する場合で、これはある多項式をかけていくときに特定の次数の項の係数だけを求めることに帰着される。 これはi番目までの多項式を乗算したときの各次数の係数に関してDPすることで求められる。

gist.github.com

sshfsでunmountできない場合

sshfsで接続が切れた時にunmountできなくなることがある。

そういうときはプロセスを一度切ってからunmountすればよい

pgrep -lf sshfs
kill -9 <id-of-sshfs>
diskutil unmount <mountpoint>  # for mac

pgrepの-lはlong output、-fはプロセス名以外からともマッチングさせる

Macでsshfsを使ってローカルからリモートのファイルを触る - Qiita

cannot umount or mount an sshfs volume after ssh connection cut · Issue #45 · osxfuse/osxfuse · GitHub

追記

sshfsでタイムアウトを抑制するには-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3をフラグで与えればよい

linux - SSHFS mount that survives disconnect - Server Fault