ぼくのかんがえたさいきょうの http://pekopeko1.bitbucket.org/ archiving something about I'm interested in; computer etc. en-us Sun, 18 Aug 2013 00:00:00 +0900 http://pekopeko1.bitbucket.org/2013/08/18/benchmark.html http://pekopeko1.bitbucket.org/2013/08/18/benchmark.html <![CDATA[rubyとpythonにおけるfor文と関数型メソッドの速度比較]]>

rubyとpythonにおけるfor文と関数型メソッドの速度比較

目的

for文と関数型メソッド(map)のどちらが効率的かの参考のため

測定パターン

パターン 説明
パターン1 1万個(0〜9999)の要素を持つ配列の2乗を計算した配列を作成する。
パターン2 1万個(0〜9999)の要素を持つ配列から3または5の倍数抽出した配列を作成する。
パターン3 1万個(0〜9999)の要素を持つ配列の総和を計算する。
パターン4 9999個の文字列”hoge”と最後尾に文字列”fuga”を持つ配列から文字列”fuga”の有無を調べる。
パターン5 0〜9999をキーにしてキーの2乗を値とするハッシュを作成する。

測定パターン(バリエーション解説)

ruby

パターン メソッド名 説明
パターン1-1 make_power_list_basic for文で作成した
パターン1-2 make_power_list_map map関数を使用した
パターン2-1 make_filter_list_basic for文で作成した
パターン2-2 make_filter_list_map map関数を使用した
パターン3-1 make_sum_list_basic for文で作成した
パターン3-2 make_sum_list_inject inject関数を使用した
パターン3-3 make_sum_list_inject inject関数で使用する関数をシンボル呼び出しにして効率化した
パターン4-1 make_search_list_basic for文で作成した
パターン4-2 make_search_list_include include関数を使用した
パターン5-1 make_power_hash_basic for文で作成した
パターン5-2 make_power_hash_zip_map 値の配列をmap関数で作成し、zip関数でhashの元配列を作成した

python

パターン メソッド名 説明
パターン1-1 make_power_list_basic for文で作成した
パターン1-2 make_power_list_map map関数を使用した
パターン1-3 make_power_list_compreh リスト内包表記を使用した
パターン2-1 make_filter_list_basic for文で作成した
パターン2-2 make_filter_list_filter filter関数を使用した
パターン2-3 make_filter_list_compreh リスト内包表記を使用した
パターン3-1 make_sum_list_basic for文で作成した
パターン3-2 make_sum_list_reduce reduce関数を使用した
パターン3-3 make_sum_list_sum sum関数を使用した
パターン4-1 make_search_list_basic for文で作成した
パターン4-2 make_search_list_index index関数を使用して戻り値があれば1を返すようにした
パターン4-3 make_search_list_compreh リスト内包表記を使用した
パターン5-1 make_power_hash_basic for文で作成した
パターン5-2 make_power_hash_zip_map 値リストをmap関数で作成し、dictの元をzip関数で作成した
パターン5-3 make_power_hash_zip_compreh 値リストをリスト内包表記で作成し、dictの元をzip関数で作成した
パターン5-4 make_power_hash_compreh リスト内包表記でキーと値のタプルを作成する方式を使用した

測定方法

各パターンを10000回繰り返した時間を測定する。

環境

CPU

Intel(R) Core(TM) i7-2677M CPU @ 1.80GHz

python

$ python -V
Python 2.7.3

ruby

$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]

Benchmarker

ruby:benchmark

python:Benchmarker ( pip install benchmarker でインストール)

結果

ruby

$ ruby loop.rb
***make_power_list_basic***
      user     system      total        real
 22.540000   0.010000  22.550000 ( 22.580915)

***make_power_list_map***
      user     system      total        real
 14.370000   0.010000  14.380000 ( 14.394143)

***make_filter_list_basic***
      user     system      total        real
 26.740000   0.000000  26.740000 ( 26.767431)

***make_filter_list_map***
      user     system      total        real
 26.120000   0.020000  26.140000 ( 26.161219)

***make_sum_list_basic***
      user     system      total        real
 11.560000   0.000000  11.560000 ( 11.568072)

***make_sum_list_inject***
      user     system      total        real
 13.880000   0.000000  13.880000 ( 13.891798)

***make_sum_list_inject_symbol***
      user     system      total        real
 11.550000   0.000000  11.550000 ( 11.566363)

***make_search_list_basic***
      user     system      total        real
 10.100000   0.250000  10.350000 ( 10.365433)

***make_search_list_include***
      user     system      total        real
  6.390000   0.000000   6.390000 (  6.394231)

***make_power_hash_basic***
      user     system      total        real
 39.340000   0.130000  39.470000 ( 39.507706)

***make_power_hash_zip_map***
      user     system      total        real
 26.540000   0.000000  26.540000 ( 26.579716)

python

$ python loop.py

##                                 user       sys     total      real
make_power_list_basic           13.0800    0.0100   13.0900   13.1003
make_power_list_map             12.4900    0.0000   12.4900   12.5002
make_power_list_compreh          6.1500    0.0000    6.1500    6.1630
make_filter_list_basic          21.7700    0.0000   21.7700   21.7847
make_filter_list_filter         21.6400    0.0000   21.6400   21.6599
make_filter_list_compreh        16.9500    0.0000   16.9500   16.9694
make_sum_list_basic              5.6800    0.0000    5.6800    5.6786
make_sum_list_reduce            10.0700    0.0000   10.0700   10.0751
make_sum_list_sum                1.5800    0.0000    1.5800    1.5816
make_search_list_basic           4.7800    0.0000    4.7800    4.7857
make_search_list_index           1.7400    0.0000    1.7400    1.7430
make_search_list_compreh         3.6300    0.0000    3.6300    3.6309
make_power_hash_basic           13.3500    0.0000   13.3500   13.3585
make_power_hash_zip_map         31.1400    0.0000   31.1400   31.1695
make_power_hash_zip_compreh     24.5300    0.0000   24.5300   24.5598
make_power_hash_compreh         22.0500    0.0000   22.0500   22.0788

パターン別結果

pattern lang method user sys total real
pattern1 ruby make_power_list_basic 22.5400 0.0100 22.5500 22.5809
pattern1 ruby make_power_list_map 14.3700 0.0100 14.3800 14.3941
pattern1 python make_power_list_basic 13.0800 0.0100 13.0900 13.1003
pattern1 python make_power_list_map 12.4900 0.0000 12.4900 12.5002
pattern1 python make_power_list_compreh 6.1500 0.0000 6.1500 6.1630
pattern2 ruby make_filter_list_basic 26.7400 0.0000 26.7400 26.7674
pattern2 ruby make_filter_list_map 26.1200 0.0200 26.1400 26.1612
pattern2 python make_filter_list_basic 21.7700 0.0000 21.7700 21.7847
pattern2 python make_filter_list_filter 21.6400 0.0000 21.6400 21.6599
pattern2 python make_filter_list_compreh 16.9500 0.0000 16.9500 16.9694
pattern3 ruby make_sum_list_basic 11.5600 0.0000 11.5600 11.5680
pattern3 ruby make_sum_list_inject 13.8800 0.0000 13.8800 13.8917
pattern3 ruby make_sum_list_inject_symbol 11.5500 0.0000 11.5500 11.5663
pattern3 python make_sum_list_basic 5.6800 0.0000 5.6800 5.6786
pattern3 python make_sum_list_reduce 10.0700 0.0000 10.0700 10.0751
pattern3 python make_sum_list_sum 1.5800 0.0000 1.5800 1.5816
pattern4 ruby make_search_list_basic 10.1000 0.2500 10.3500 10.3654
pattern4 ruby make_search_list_include 6.3900 0.0000 6.3900 6.3942
pattern4 python make_search_list_basic 4.7800 0.0000 4.7800 4.7857
pattern4 python make_search_list_index 1.7400 0.0000 1.7400 1.7430
pattern4 python make_search_list_compreh 3.6300 0.0000 3.6300 3.6309
pattern5 ruby make_power_hash_basic 39.3400 0.1300 39.4700 39.5077
pattern5 ruby make_power_hash_zip_map 26.5400 0.0000 26.5400 26.5797
pattern5 python make_power_hash_basic 13.3500 0.0000 13.3500 13.3585
pattern5 python make_power_hash_zip_map 31.1400 0.0000 31.1400 31.1695
pattern5 python make_power_hash_zip_compreh 24.5300 0.0000 24.5300 24.5598
pattern5 python make_power_hash_compreh 22.0500 0.0000 22.0500 22.0788

所感

  • rubyでは関数型メソッドを使用することで時間を短縮できる場合が多い。
  • ただし、injectでは性能が遅くなってしまい、シンボル呼び出しで高速化してやっとfor文並となる結果だった。
  • pythonでは関数型メソッドを使用することの速度上のメリットはなかった。
  • 特にreduceでは倍近く遅くなった。
  • リスト内包表記を使うと早い。
  • sum早い。
]]>
Sun, 18 Aug 2013 00:00:00 +0900
http://pekopeko1.bitbucket.org/2013/04/30/wikify.html http://pekopeko1.bitbucket.org/2013/04/30/wikify.html <![CDATA[web2pyでwiki化する方法]]>

web2pyでwiki化する方法

はじめに

プラグインを使わなくてもできるのでメモ

手順

  1. コントローラー(default.pyなど)に以下を追記する。
# This goes in the controller which will present
# the wiki interface (usually default.py)
def wiki():
    return auth.wiki()
  1. <コントローラー>/wiki.html(例:default/wiki.html)に以下を追記する。
{{extend 'layout.html'}}
<!-- Note that the response item named content
contains the helper returned by the auth.wiki() call
and you can choose where to place it within your
view layout -->
{{=content}}
  1. 以下のURLにアクセスする。
http://<web2pyアプリのURL>/<コントローラー>/wiki
]]>
Tue, 30 Apr 2013 00:00:00 +0900
http://pekopeko1.bitbucket.org/2013/03/23/sed.html http://pekopeko1.bitbucket.org/2013/03/23/sed.html <![CDATA[ドットインストールをまとめる(sed入門)]]>

ドットインストールをまとめる(sed入門)

sed入門

#01 sedとはなにか?

  • 概要
    • テキスト処理ツール
  • 知識
    • Unixコマンド
    • 正規表現
    • vim
  • 環境
    • GNU sed 4.1.5

#02 はじめてのsed

行の削除

3行目を消すには ’3d’ を指定する。

  • -eexpression
$ sed -e '3d' sample.txt

-e を消してもOK

$ sed '3d' sample.txt

ファイルを直接編集するには -i オプションをつける

$ sed -i -e '3d' sample.txt

バックアップファイルも作成できる。

(この場合、変更された sample.txt と変更前の内容をもつ sample.txt.bak が作成される。)

$ sed -i.bak -e '3d' sample.txt

別ファイルに書いたコマンドを実行することもできる。

以下の内容のex1.sedファイルがある時

$ cat ex1.sed
3d

-f オプションを指定するとファイルの内容の処理を実行する。

$ sed -f ex1.sed sample.txt

#03 パターンスペースについて理解しよう

sedの命令はaddressとcommandから構成される。

3dの例では以下の構成

address command
3 d

sedが処理するときはパターンスペースという一時的なバッファを使う。

処理の流れは以下の通り。

  1. fileから一行読み込んでパターンスペースに格納
  2. addressにマッチ? → command実行!
  3. パターンスペースを表示

#04 アドレスを使いこなそう

3行目以外を削除

  • ! で否定
$ sed -e '3!d' sample.txt

1行目と3行目を削除

  • 複数指定するときは ; で区切る。
$ sed -e '1d;3d' sample.txt

1から3行目を削除

  • 範囲の指定は , カンマで区切る。
$ sed -e '1,3d' sample.txt

1行目から2行おきに削除

  • ~で指定する。
$ sed -e '1~2d' sample.txt

最終行を削除

  • $で最終行を表す。

    最終行のみ削除

    $ sed -e '$d' sample.txt
    

    3行目から最終行まで削除

    $ sed -e '3,$d' sample.txt
    

正規表現を使う。

  • / で囲む。

    iで終わる行を削除

$ sed -e '/i$/d' sample.txt

アドレス省略するとすべての行が対象になる。

全行削除
$ sed -e 'd' sample.txt

#05 p/a/iコマンドを使ってみよう

p(print)

指定した行を印字する。

以下の例では指定した行が2回表示される。

$ sed -e '3p' sample.txt

-n オプション(パターンスペースの表示抑止)と組み合わせると、指定した行のみの表示になる。

$ sed -n -e '3p' sample.txt

q(quit)

指定した行で処理を抜ける。

以下の例では3行目まで表示して終わる。

$ sed -e '3q' sample.txt

i(insert)

前の行に挿入する。

  • 挿入したい文を \ に続ける
$ sed -e '3i\---- insert ----' sample.txt

a(append)

後ろの行に追加する。

  • 挿入したい文を \ に続ける
$ sed -e '3a\---- append ----' sample.txt

#06 yコマンドで置換してみよう

yコマンドは1文字づつの置換

全行で小文字のtを大文字Tにする。

$ sed -e 'y/t/T' sample.txt

複数の文字を対象にする場合(t→T、o→O)

  • 一文字の置換なので、toをTOにするのではない。
  • 順序も対応している。
$ sed -e 'y/to/TO' sample.txt

#07 sコマンドで置換してみよう

sコマンドは文字列の置換

単純な指定では最初にマッチした1つのみ

$ sed -e 's/apple/Apple/' sample.txt

フラグ g をつけるとすべてが対象になる。

$ sed -e 's/apple/Apple/g' sample.txt

フラグ 2 をつけると2つ目にマッチした文字列のみが置換される。

$ sed -e 's/apple/Apple/2' sample.txt

フラグ i をつけると大文字小文字を区別しない。

  • フラグは複数指定してもよい。
$ sed -e 's/apple/Ringo/ig' sample.txt

正規表現を使用してもよい。

$ sed -e 's/[aA]pple/Ringo/g' sample.txt

#08 &や1を使って置換してみよう

マッチした文字列を置換する文字列に使いたい場合
(1を置換して【1】にするとか)

マッチした文字列は & で使用できる。

$ sed -e 's/[1-2]/【&】/' sample.txt

複数マッチする場合は \1 , \2 ,,, \n で使用できる。

順序を入れ替える例

  • () で囲むことで複数の文字列を指定できる。
    • () はエスケープが必要なので注意
$ sed -e 's/\([1-2]\) \(.*\)/\2 【\1】/' sample.txt

#09 ホールドスペースを使ってみよう(1)

複数行にまたがる処理を実行したい場合に使用する。

ホールドスペース
パターンスペースのさらに奥にあるバッファのイメージ

コマンド

h
hold パターンスペースの中身をホールドスペースに退避する。
g
get ホールドスペースの中身をパターンスペースに戻す。
x
exchange 両者を交換する。

style.css

#main {
    color: red;
    font-weight: bold;
    font-size: 14px;
    background: green;
}

ex2.sed

# color change

/color: / {
    h
    s/color: /background: /
    x
}
/background: / {
    g
}
$ sed -f ex2.sed style.css

#10 ホールドスペースを使ってみよう(2)

処理の解説

1行目 パターンスペースの内容を表示

2行目 /color: / にマッチするので処理を実行

  1. 処理実行前の状態
pattern space color: red;
hold spase  
  1. ホールドスペースにパターンスペースの内容を格納
pattern space color: red;
hold spase color: red;
  1. パターンスペースで置換を実行
pattern space background: red;
hold spase color: red;
  1. パターンスペースとホールドスペースを交換
pattern space color: red;
hold spase background: red;
  1. パターンスペースの内容を表示

3,4行目 パターンスペースの内容を表示

5行目 /background: / にマッチするので処理を実行

  1. 処理実行前の状態
pattern space background: green;
hold spase background: red;
  1. ホールドスペースの内容をパターンスペースに戻す。
pattern space background: red;
hold spase background: red;
  1. パターンスペースの内容を表示

6行目 パターンスペースの内容を表示

]]>
Sat, 23 Mar 2013 00:00:00 +0900
http://pekopeko1.bitbucket.org/2012/12/09/android_internal.html http://pekopeko1.bitbucket.org/2012/12/09/android_internal.html <![CDATA[Androidの内部動作]]>

Androidの内部動作

はじめに

SL4AでAndroidでPythonが使えることを知り、いまさらながらAndroidの内部構造(Dalvik VMなど)について調べてみたメモ

参考

  • Dalvik VM Internals
  • Dalvik仮想マシンのアーキテクチャ
  • Androidアプリの内部動作に関する情報(1)
  • Androidアプリの内部動作に関する情報(2)
]]>
Sun, 09 Dec 2012 00:00:00 +0900
http://pekopeko1.bitbucket.org/2012/12/02/rest_syntax.html http://pekopeko1.bitbucket.org/2012/12/02/rest_syntax.html <![CDATA[reStructuredtext Cheatsheet]]>

reStructuredtext Cheatsheet

概要

reStructuredText(rst,reST)の基本は以下の通り。

  • 記号を使って構造を作っていく
  • 空行やインデント(行頭の空白)にも意味がある。
  • 入れ子になったブロック(段落)では内側の文章のインデント(空白の桁数)を統一し、同じ位置(桁)から文章が始まるようにする。
  • 同じ構造を作るにも、何種類かの記号を使うことが出来るものがある。その文書内で使う記号に統一が取れていれば、どれでもいい。

文章構造

見出し

  • 段落の見出し(HTMLのh1,h2,…相当)には「=」や「-」「#」「*」「^」「~」「”」といった記号を使う。
    • 記号と見出しレベルには特定の関係はなく、使用した順番で決定される。
  • 見出しの文章の上下にその記号を並べる(上下で囲むイメージ)か、文章の下に記号を並べる(アンダーラインの様なイメージ)は別のレベルとして認識される。
  • どちらの場合でも、記号は文章の文字数(バイト数)以上にする必要がある。
例1(Sphinxで説明されているPythonドキュメントの慣例):
 
##################
Part
##################

*******************
Chapter
*******************

Section
===========================

Subsection
---------------------------

Subsubsection
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Paragraph
"""""""""""""""""""""""""""""""""

表構造

Grid Tables

  • 主な注意点
  • 表の枠線の長さは列の要素と同じ長さ。
  • 表中の +--+ でセルの連結を調整できる。
  • つまり書いた通りの表で表示されるということ

Simple Tables

  • 主な注意点
  • 列の間は2マス以上開ける。
  • ラインの長さの正確な制限は不明。以下のルールがありそう。
  • 各列はヘッダの要素以上の長さが必要。
  • 各列要素の始点はラインの始点と合わせる。
  • \ で空白セルを表す。
  • 途中でセルを結合すると変更できない感じ(要確認)
=====  =====
col 1  col 2
=====  =====
1      Second column of row 1.
2      Second column of row 2.
       Second line of paragraph.
       Each column must have 4 spaces.
       But header and lines can be separated 1 space.
3      - Second column of row 3.
       - Second item in bullet
         list (row 3, column 2).
\      Row 4; column 1 will be empty.
Row 5 has 1 column.
============
col 1 col 2
1 Second column of row 1.
2 Second column of row 2. Second line of paragraph. Each column must have 4 spaces. But header and lines can be separated 1 space.
3
  • Second column of row 3.
  • Second item in bullet list (row 3, column 2).
Row 4; column 1 will be empty.
Row 5 has 1 column.

CSV Tables

  • 主な注意点
  • 題名はなくても良い。
.. csv-table:: title
    :header: header1,header2,header3
    :widths: 20,25,30

    cell1,cell2,cell3
    cell3,,cell4
title
header1 header2 header3
cell1 cell2 cell3
cell3   cell4

List Tables

.. list-table:: title
    :widths: 15 10 30
    :header-rows: 1

    * - header1
      - header2
      - header3

    * - r1cell1
      - r1cell2
      - r1cell3

    * - r2cell1
      - r2cell2
      - r2cell3
        r2cell3-cont
title
header1 header2 header3
r1cell1 r1cell2 r1cell3
r2cell1 r2cell2 r2cell3 r2cell3-cont

文字修飾

  • 主な注意点
  • インライン文字修飾の前後はスペースを空けること。
  • 英語は単語が分かれるので意識しなくてよいが、日本語の場合は忘れがち。

イタリック体

*italic*

italic

太字

**bold**

bold

上付き文字

Java `TM`:sup:

Java TM

下付き文字

v `1`:sub:

v 1

参考

題名 URL 説明
はやわかり reStructuredText http://www.planewave.org/translations/rst/quickref.html 個人的には最も簡潔にまとまった説明ではないかと思う。ただし、簡潔なので、基本思想やディレクティブがわかりにくく、この説明だけでは足りなかった。
Restructured Text (reST) and Sphinx CheatSheet http://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html 文法とそれらがどう表示されるかがまとめられている。ただし、個人的には不要な説明や冗長な説明もあったので、このまとめをつくった。リンクは他にも適切なものがあるかも。
Online reStructuredText editor http://rst.ninjs.org//rst/quickref.html 書いてすぐ表示を確認できるので便利
]]>
Sun, 02 Dec 2012 00:00:00 +0900
http://pekopeko1.bitbucket.org/2012/11/25/getting_start.html http://pekopeko1.bitbucket.org/2012/11/25/getting_start.html <![CDATA[はじめにーTinkererの使い方]]>

はじめにーTinkererの使い方

やりたいこと

  • Sphinxベースで文書管理したい
  • →TinkererというCMSでブログ風に管理できる。
  • 公開先はbitbucketにする。

やること

  • Sphinxインストール
  • Tinkererインストール
  • bitbucketリポジトリ作成
  • bitbucketにアップロード

手順

基本的に参考に書いてある通りなので自分でやってみてハマったポイントなどを注意点に書く。

コマンドあれこれ

コマンド

$ tinker

tinkererでなくtinker

オプション

-s,–setup 基本ファイル作成(初期設定で一度だけ実行) -p,–post 記事を作成する。

$ tinker --post 'hoge'
--page 単独ファイルを作成する
$ tinker --page 'hoge'

-d,–draft ドラフトを作成する。

$ tinker --draft 'hoge'

ドラフトから投稿に変更

$ tinker --post ./draft/hoge.rst

投稿からドラフトに変更

$ tinker --draft ./yyyy/mm/dd/hoge.rst

-b,–build rstファイルをビルドしてhtmlを作成する。

$ tinker -b

Note

バージョン1.0以降の追記

ドラフトから日付を指定して投稿

$ tinker --date yyyy/mm/dd -p drafts/hoge.rst

注意点

  • 自分の環境では日本語名で`tinker -p`が通らない。
  • パッチも当ててみたがうまく行かない。まあたかがファイル名なのでとりあえず英語でもいいかなって感じ。
  • bitbucketのリポジトリ作成が具体的にどうするかわかりにくかったが、ほんとに<user名>.bitbucket.orgというリポジトリをつくればよいという意味

参考

Tinkererの使い方に関しては、以下が詳しい。

TinkererでSphinxなブログ環境を構築する
http://akirakw.github.com/2012/09/12/create_blog_with_tinkerer.html

しかし、上記はGithubでの公開手順のため、自分は使用できない。 公開方法は以下が参考になる。

Sphinxで作ったドキュメントのホスティング
http://sphinx-users.jp/cookbook/hosting/index.html#bitbucket-org
]]>
Sun, 25 Nov 2012 00:00:00 +0900