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
でコンパイルできる。
タイムアウトを設定してJoblibで並列処理を実行
pythonで並列処理をするときにはjoblibが手軽で便利だが、タイムアウト時の処理に自由度がない。
というのも、joblib.Parallel
の引数にtimeout
を設定すると、指定した時間を超えたときに例外を投げて計算全体を止めてくれるが、タイムアウトした処理を無視して計算を継続するようなことはしてくれない。
pythonで自作関数にタイムアウトを設定するパッケージだとtimeout-decoratorが有名だが、multithreadingにも対応しているようだ。
なのでjoblib.Parallel
のbackendをthreadingにすれば並列処理でtimeout-decoratorを使うことができる。
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 - How to implement __eq__ for set inclusion test? - Stack Overflow
ポリアの数え上げ定理の実装
最近ポリアの数え上げ定理の実装が欲しい場面に遭遇したのでlatexでメモを取りつつちまちま勉強していた。
↓はその時のメモ(証明は基本的に書いてない)。
ポリアの定理はある対称性のもとに色塗りをする場合の数を与えるものだが、その拡張として
- 色塗りの固定部分群が与えられた群と共役であるような色塗りの場合の数(White's lemma)
- 色を入れ替えて同じになる色塗りを同一視したときの数え上げ(De Bruijn)
などがあるようだ(こちらもそのうち勉強したい)。
さて、実装だが全通りを調べる場合は単に数式をそのままコードにすればいい。 問題は(例えば4箇所を青1赤3で塗るみたいに)使う色の数を固定する場合で、これはある多項式をかけていくときに特定の次数の項の係数だけを求めることに帰着される。 これはi番目までの多項式を乗算したときの各次数の係数に関してDPすることで求められる。
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
追記
sshfsでタイムアウトを抑制するには-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
をフラグで与えればよい