Python

yes!yes!yes! 〜yesベンチマーク〜

yesベンチマーク UNIX系OS(?)にはyesコマンドがある。これをベンチマークに使えないかとふと思い立ったので試してみた。yesコマンドには回数指定するものが無いので、head -nで回数を指定した。今回は1000000回で行った。 $ time yes | head -n 1000000 R…

自分なりにPythonのwith構文を解釈してみた

ことのはじめ TwitterでPythonのwith構文分からん、って言ってる人がいて、てけとーに返事してしまったのだが、ふと調べてみたら違ったのでちゃんと理解しておこうと思った。 実際のwith構文 withはclassの生成と削除をコントロールすることで、RAIIを実現す…

ary[-1]の動作

ary[-1]の動作 配列の-1番目の要素を指定した場合何が起こるのかちょっと興味あったので調べてみた Pythonの場合 我らがPythonは後ろから1番目の意味になる。 ary = [1,2,3] print(ary[-1]) # 3 Rubyの場合 RubyもPythonと同じ仕様 ary = [1,2,3] puts ary[-…

UbuntuでPythonをアンインストールしてみる

そもそもの発端 FedoraだったかRed HatだったかCentOSだったかは知らないが、「yumでpythonをremoveするとKernelもアンインスコしようとするんだけどwww」とかいう話があったので、じゃあUbuntuでもapt-get remove pythonしてみよう!という話。 Ubuntu Serv…

msgpack-rpcが地味に凄い件について 〜簡易DBを作ろう!〜

やること Python上のmsgpack-rpcで簡単なデータ同期用DBを作る。 msgpackの超簡単な説明 JSONみたいなテキストをマシン間転送で使うのは遅いからバイナリでやろうぜ!っていう規格。BSONに良く似てる感じ。http://msgpack.org/msgpack-rpcはmsgpackを使って…

Ubuntu12.04のSSLがおかしいらしい 〜Ubuntu12.04 + PythonでSSL通信〜

Ubuntu12.04LTSキタコレ! 意気揚々としてUbuntu12.04にアプデしたので、とりあえずUnity、GNOME-shell、XFCE4と一通り試してみることに。UnityはLTSになっただけあって安定してきたと思う。特にデュアルモニター周りはGNOMEにかなり追い付いてきてる様子。…

剰余のうんちく

はじめに 方向を以下のように定義しておく 上(0度):0 右(90度):1 下(180度):2 左(270度):3 すると、90*n度回転させる処理はそのまま足し算で実行できる。 だが、1回転した場合0-3に正規化する必要がある。 この処理のお話。 剰余の限界 この正規…

Kyoto CabinetをPythonで試す

はじめに SQLが嫌いなので、TerminatterでMongoDB使ってるぽんこつさんだけど、気になったのでKey Value Store型で最も早い(らしい)Kyoto Cabinetを試そうかと思ったけど最初のexampleで躓いたお話。 Kyoto Cabinetのバインディングがダサい Kyoto Cabinet…

とっても遅延評価なPython3

はじめに Python2.x系は関数型言語としては、遅延評価が弱かったのだが、Python3から幾らかのBuilt-in Functionが強力な遅延評価機能を導入したのでちょっと見てみる。 filter Python2までは 文字列・タプル→そのまま それ以外→リスト を返していた(つまり…

Pythonで大規模な配列のパフォーマンス(append編)

はじめに Pythonで大規模な追記を扱う時に、どの型を使うと早いのか、パフォーマンスを調べてみる。ちなみにPythonは3.2を使用。 list まずは定番のlist型 l = [1,2,3] for i in range(10**7): l.append(i) 5.7秒、1.6GB set 早いと評判のset型 s = set([1,2…

「ぐへへお姉ちゃんパンツ何色」から始めるPythonクラス解説

はじめに とりあえずこれを読みましょう。http://b0r0nji.blogspot.com/2011/12/blog-post.html Python編 さて、ほむほむのパンツをPythonで実装するとこうなります。(ぽんこつさんはお姉ちゃんキャラ嫌いなのです) class Pants(object): def __init__(sel…

Python importテクニック(発展版)

はじめに 前回のPython importテクニック見てて、 「ひょっとしたらこんなアホなimportできるんじゃね」 とか思ったので試してみる。 やったこと 前回importについて 「他の文と同じで、特別扱いしない」 という主旨の発言をした。ということは、実行時にimp…

Python3のsetter補足

おさらい 前に書いた記事で、python3で@hoge.setterを使って、 class Class: def __init__(self, a): self._a = a @property def a(self): return self._a @a.setter def a(self, v): if v < 20: self._a = v else: print("ERROR") if __name__ == "__main__…

Python importテクニック

Pythonのimportのここが凄い Pythonのimportは結構特殊というかフレキシブルな構造をしている。他の言語の類似機能だと必ず最初に宣言する必要があるが、Pythonの場合はそのような配慮は全く不要で、何処でも書けてしまう。また、書いた所でimport処理が実行…

propertyが使えない原因

propertyが使えない理由は、propertyが新スタイルのクラスを要求するからだと分かった。http://www.python.jp/doc/release/reference/datamodel.html#newstyle要約すると、Pythonは2.1から新クラスを導入したが、互換性維持の為、新クラスを利用する場合は、…

propertyが使えないだと!?

Pythonでpropertyを使ってみようと思って、大いにハマったのでメモ。 class Class: def __init__(self, a): self._a = a def get_a(self): return self._a def set_a(self, v): if v < 20: self._a = v else: print "ERROR" a = property(get_a, set_a) if _…

点と線分間の距離

会社で点と線分の距離を計算する必要があって、困っていたら、http://www.deqnotes.net/acmicpc/2d_geometry/linesに書いてあったので、Python風に書き換え。 def dot(p1, p2): return p1.real*p2.real + p1.imag*p2.imag def cross(p1, p2): return p1.real…

PythonのMeCabが残念過ぎる件について

はじめに Twitterの発言をベイズ分類器で解析しようかと、MeCabをインストールしてたら大いにムカついたのでメモ。 MeCabのここが残念 tagger = MeCab.Tagger("-Ochasen") node = tagger.parseToNode("PythonからMeCabの形態素解析機能を使ってみました。") …

pynotifyとdate.strptimeの複合バグ

バグの種類 pynotifyをimportしたコードで、datetime.strptimeで、文字列を解析すると発生するバグ。Junとかの月・曜日が該当する。 解決方法 localeの問題らしく、情報が中国語しか無かった。http://hi.baidu.com/esbat/blog/item/b520232d748ac93f359bf742…

Terminatter Hack

はじめに Terminatterそこそこ自信があるのだけど、あんまり流行ってないみたいなので、Terminatterのこんなところが凄いよーとか書いてみる。downloadは以下からどうぞ http://ponkotuy.com/hg 例えばこんな感じ 左の画面はmain.pyを動かしている。所謂User…

Pythonのsumって遅くね

Pythonで、listみたいな形式のデータをsumしたときの速度の話。 sum(data[j][i-1:i+2]) と data[j][i-1] + data[j][i] + data[j][i+1] という2つで比較したところ、後者の方が25%ぐらい早くなった。arrayが原因かは分からないけど、少量のsumやるぐらいなら…

PythonでPerlin Noiseを生成する

Perlin Noiseって何ぞ 普通に乱数を何度も使うと、隣接した値と非依存の値を生成する(そうでなければ乱数とは言わない)ので、ランダムかつなめらかな地形みたいなものは作れない。このような「ランダムかつなめらか」という目標を達成する手法としてPerlin…

Terminatterをリリースしてみる

Terminatterとは Terminalで動く、UserStreamオレオレTwitterクライアントTerminatter。以下の特徴がある。 軽い ssh越しに実行できる キーボードだけで操作できる しかもEmacsキーバインドが使える!←かなり重要 端から見ると格好良い←超重要 当然欠点もあ…

Speeding up of Python File Copying

はじめに 前回の反省を踏まえ、自作クラスを使ってファイルコピーを高速化してみる。 コード https://ideone.com/4MUEW 原理 1つずつファイルを処理すると、ランダムアクセスが増えて、遅くなるのだから、連続で読み込んで、連続で書き出すようにすればいい…

Python File Copy Test1

はじめに ファイルコピーのプログラムを作ってみたのは良いが、やったらめったら遅いのが気になって、パフォーマンスを計測してみることに。とりあえずshutilが遅いのではないか、という疑惑があって、shutil.copyfile、shutil.copy、os.system('cp "{0}" "{…

Pythonでstrを継承してみる

こんな感じで__new__を使えば良さげ。http://ideone.com/2VlhSついでにclass定数(という表現は間違ってるような気がしないでもないが)も使うと、http://ideone.com/0CJwWideoneの使い方も覚えたし満足。

Pythonのlistの処理速度

はじめに どちらかというと計算機寄りの人間なもので、プログラミング言語の処理速度というのは気になってしょうがない。特に処理時間のオーダーを考えずにプログラム書くなんて考えられない!特にPythonのlistは結構不可解な部分が多い。名前からしてC++のL…

Pythonのファイル書き込み高速化

事の始まり 私は今、Pythonで、約1万項目の変換テーブルを使って、数百のファイルにある数万行のデータ変換を行っている。(ちなみに、書き込み前に、置換という名の削除を行っている)変換自体は行単位であり、猶且変換テーブルにデータがあることを保証し…

PythonでProfiling

はじめに Pythonでもパフォーマンスが気になった場面があったので、まずは基本であるProfileを取ろうと思ったのが事の始まり。 ただやってみると、結構面倒な場面がちらほらあって、苦戦したのでメモに残しておく。目標としては、Profileを取るだけでなく、…

自動で停電時間を取得する

はじめに 予め停電時間を、コンピュータが取得できてれば、色々有効活用できるんじゃね、と思ってスクリプト書いてみた。 原理 基本的にはhttp://bizoole.com/power/からHTMLを取得して解析を行うだけのスクリプト。ただ、このサイトに無意味な負荷を掛ける…