タグ

ブックマーク / nishiohirokazu.hatenadiary.org (7)

  • Pythonで__slots__を使ってメモリを節約 - 西尾泰和のはてなダイアリー

    先日こんな実験をして、大量のオブジェクトを作った時にはそのオブジェクトが持っている__dict__の1048バイトが無視できなくなってくることを確認した: Pythonでメモリ消費量のプロファイルを取る 今日はその解決編。先日のコードに1行書き足してみよう。__slots__で始まる行がそれだ。 from guppy import hpy h = hpy() N = 100000 class Hoge(object): __slots__ = ['x', 'y', 'z', 'a', 'b', 'c'] def __init__(self): self.x = 1 self.y = 1 self.z = 1 self.a = 1 self.b = 1 self.c = 1 x = [Hoge() for x in range(N)] print h.heap() これによって、変更前ではH

    Pythonで__slots__を使ってメモリを節約 - 西尾泰和のはてなダイアリー
    mooz
    mooz 2012/10/17
  • Pythonでメモリを食い過ぎた時に見直すポイント - 西尾泰和のはてなダイアリー

    ちょっと複雑なアルゴリズムをPythonで実装してみて、自分の予想以上にメモリをってしまったので何が原因なのかプロファイルしてみた。 辞書を大量に使ってはいけない 指摘されてみれば当たり前のことなんだけども、辞書はハッシュテーブルなのでメモリをたくさん使う。「グラフの頂点ごとに整数→整数のマッピングを持ちたいな」と思って、うっかり辞書を使ってしまったのだが、エントリー数が6個でも 1048バイト×頂点数 のメモリが吹っ飛んでいく。いくらハッシュのアクセスがO(1)だからといって、1048バイトmallocしてスラッシング起こしてんだったら全然安くない。エントリの個数とアクセス頻度によってはO(n)で線形探索したほうがよっぽどよい。 エントリーの個数が5件までならハッシュテーブルではないコンパクトな持ち方をするので280バイト。それでもでかい。 自作クラスのインスタンスも辞書を持っている

    Pythonでメモリを食い過ぎた時に見直すポイント - 西尾泰和のはてなダイアリー
  • 多重継承まとめ - 西尾泰和のはてなダイアリー

    JavaはInterfaceという特殊な実装を持たないものだけ多重継承できる。実装を多重継承する仕組みはない。同じシグネチャのメソッドを持っている2つのInterfaceを継承した際にエラーにならないので衝突に気付けない。 Pythonはクラスを多重継承できる。同じ名前のメソッドを持っている2つのクラスを継承した際にどのメソッドが呼ばれるかはC3線形化を使って決定される。see: A Monotonic Superclass Linearization for Dylan RubyはModuleという「なにかを継承することはできなくてインスタンス化もできないもの」だけは多重継承できる。Moduleが別のものを継承できないためメソッドの解決は素朴な探索でOK(include A include BしたらBでの実装が優先) SmalltalkにはTraitという実装の多重継承ができるしくみがあ

    多重継承まとめ - 西尾泰和のはてなダイアリー
    mooz
    mooz 2010/09/24
    Interface, Module, Trait, Role. メソッド解決. C3 線形化.
  • Ruby 1.9.2リリースとWEBrick脆弱性問題の顛末 - 西尾泰和のはてなダイアリー

    はい、Ruby 1.9.2がリリースされましたね。このバージョンではWEBrick にゼロデイ攻撃可能な脆弱性 - スラッシュドット・ジャパンで紹介されている脆弱性が僕が書いたパッチで修正されているわけなのですけど、そもそもなんで僕が修正しているのか、って顛末がわりと面白いので紹介します。 Apple、upstreamに報告してくれないまま脆弱性をCVEに届け出る upstreamに連絡が来ないまま脆弱性が公開される ruby-devにAppleが書いたと思われるパッチが貼られる(Appleでない人間によって) パッチのライセンスが不明なので取り込めない ライセンスを問い合わせるAppleの窓口が不明なので問い合わせもできない ruby-devを読んだ人はライセンス上安全なパッチを書けない 脆弱性だから話は非公開に進めたい yuguiさんがruby-devを読んでない僕に書かせることにする

    Ruby 1.9.2リリースとWEBrick脆弱性問題の顛末 - 西尾泰和のはてなダイアリー
    mooz
    mooz 2010/08/19
    ライセンスの問題はやっかい……
  • (Python|Ruby)でネストしたスコープの外側の変数に再束縛する - 西尾泰和のはてなダイアリー

    抜粋翻訳 PEP3104: Access to Names in Outer Scopesの内容をコードで。 Rubyでの挙動(1.9.3dev) メソッドの中で定義されたメソッドは外のスコープにアクセス出来ない。 > def foo(x) > def bar() > p x > end > bar > end => nil > foo 1 NameError: undefined local variable or method `x' for main:Object from (irb):32:in `bar' from (irb):34:in `foo' from (irb):36 from /usr/local/bin/irb:12:in `<main>' メソッドの中で定義されたブロックでは、その定義されたスコープに存在しない名前への束縛のみブロックのローカル変数とし、それ以外は

    (Python|Ruby)でネストしたスコープの外側の変数に再束縛する - 西尾泰和のはてなダイアリー
  • 不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリー

    プログラミング言語は人が作ったもの。人は誤るもの。なので完璧なプログラミング言語は存在しない。 「人は誤るもの、しかし誤りに固執するのは馬鹿の所業だ。」(キケロ) プログラミング言語も、間違った設計をして、馬鹿でない人がそれを修正することの繰り返しで発展してきた。 というわけで言語間での設計判断のい違いとか失敗した設計とかを収集中。一部抜粋して講義資料に入れるつもりなので他の事例をご存知でしたらぜひ情報をいただけるとありがたいです。 if(x = 0) C言語では代入が式であるためif(x == 0)のつもりでif(x = 0)と書いてしまい、常に偽になってしまう。 x = 0の値はint、条件式はboolでないといけないので型エラーだよ派: Java x = 0は式ではないので条件式に入れたら構文エラーだよ派: Python 条件式にx = 0をいれたらx == 0と解釈するよ派: H

    不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリー
    mooz
    mooz 2010/07/25
    興味深い考察
  • Re: Python の lambda の中で手続き的な書き方をする - 西尾泰和のはてなダイアリー

    http://d.hatena.ne.jp/amachang/20080304/1204633733 (lambda: ( 式, 式 ,)[-1]) ほほー、なるほどね。式が1個の場合もあるので最後にカンマが必要なんだね。でも、各式の最後にカンマをつける方がきれいなんじゃない? (lambda: ( 式, 式, )[-1]) - 勝手に添削した。 class Scope(object): def __init__(self, parent = None): self.parent = parent self.hash = {} def var(self, key, value = None): self.hash[key] = value return value def set(self, key, value): if key in self.hash or not(self.pare

    Re: Python の lambda の中で手続き的な書き方をする - 西尾泰和のはてなダイアリー
    mooz
    mooz 2010/03/08
    lambda の添削
  • 1