コンパイラPython: Numbaの実力

Pythonを高速にする仕掛けの一つに’NUMBA’というモジュールがある。これは配列の計算のためのもモジュールNUMPYで定義された配列に計算を高速にする。NUMPY自体も配列の計算(例えば二つの配列の積)ができるが、配列の計算はもっと沢山ある。そうのような計算をPythonの演算式を使ってやるととてつもなく時間がかかる。そのような計算部分(関数として定義する)をNUMBAで高速にできる。例を示す:


#coding: utf-8

from numba import jit
from numpy import arange
import time

#関数の引数にNUMPY moduleで定義される配列があるとNUMBA
#によってその関数はコンパイルされる。
#デコレータ@jitはNUMBAを適用するか選択する

@jit
def sum2d(arr):
    M, N = arr.shape
    result = 0.0
    for i in range(M):
        for j in range(N):
            result += arr[i, j]
    return result

start = time.time()
a = arange(100000000).reshape(10000, 10000)
print(sum2d(a))
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

結果を示す:

    • NUMBAを適用しない場合:
      4999999950000000.0
      elapsed_time:38.96722865104675[sec]
    • NUMBAを適用した場合:
      4999999950000000.0
      elapsed_time:0.7770442962646484[sec]

30倍もの実行速度がえられる。Pythonコンパイラとしては以前に紹介した’pypy’もあるがNumpyを使っている場合はこのNumbaが便利かもしれない。

‘O, Draconian devil. Oh, lame saint’のアナグラム

ダヴィンチ・コードの中で言葉遊びがよく出てくる。ここではそんな言葉遊びの一つであるアナグラムを取り上げる。

アナグラムは一つの意味のある単語または一つの語句を構成している文字を入れ替えることによって意味のある別な単語または語句を生成する遊びである。

簡単な例
‘silent’(静かな)—-> ‘listen’(聞く)

英単語集(11万個)を探索して得られるアナグラムで8文字からなる単語を検索してみると最大個数は7にもなる単語がある:

‘angriest’,  ‘astringe’, ‘ganister’, ‘gantries’, ‘granites’,  ‘ingrates’,  ‘rangiest’

表題の語句のアナグラムは:

‘O, Draconian devil. Oh, lame saint’

ああ、残酷な悪魔だ。ああ、役に立たぬ聖人だ)

‘Leonardo da Vinci The Mona Lisa’

となる。

ソニーRX10M4で動画を撮影してみる

RX10M4で動画を撮影してみた。このカメラでの動画は4K(4840X2160)やHD(1920X1080)の高画質の動画が撮影できる。
メニュでフレームレート(一秒間のコマ数、典型的には一秒60コマ(60p)、pはプログレッシヴ・モードの略、iというのもあり、こちらはインターレース・モード、これは1フレームの奇数行を送り、次のフレームでは偶数行を送る方式で一つの画面になる。こちらのほうが技術的には面白い)やビットレート(ピクセルごとの色情報の精度、典型的には50Mbps、高いほど色情報の精度は高くなる)を設定できる。
ハイビジョン(HD)の大きさで60p,50Mbpsで撮影した例を下に示す。

30秒程度の撮影であるが、ファイルは180Mbの大きさになる。インターネットで公開するファイルとしては大きすぎるのでオリジナルを圧縮したFreeVideoCompressorなどのフリーソフトがそれに使える。今回は7.35Mbまで圧縮したものを使った。

RX10M4の動画撮影にはハイスピード撮影モードもあるので次回はそれを試すことにしたい。

高い知能で材料吟味:ネアンデルタール人の実像へ一歩

今日の新聞の記事のタイトルである。

5万年前ごろにネアンデルタール人が利用した洞窟から発掘したリソワール(動物の皮をなめす使われていた道具)の材質を調べて新たな知見が見つかったという話である。

研究者たちはこのリソワールの残っていた蛋白質のコラーゲンを分析し、このコラーゲンがヨーロッパバイソンやオーロックス由来であることを見つけ、このリソワールはこれらの動物の肋骨から作ったものであると結論した。一方同じ地層で見つかった動物の骨は圧倒的にトナカイのものであった。

これらの事実からネアンデルタール人は道具をつくるときにかなり材料を吟味していたのではないかということが示唆される。

あそびと知識:「エッダ」にみる

「エッダ」(17世紀に発見された北欧神話について語られた写本。9世紀から13世紀にかけて成立したとされている、古ノルド語で書かれた歌謡集(群)である。)の中でも質問競技は主題の一つである。

ヴァフスルーズニルの歌」の中では主神オージンは天地創成時代についての知識の持ち主である巨人ヴァフスルーズニルの知恵と自分の知恵との優劣を競っている。

例えば

「オージンが『最初に生まれた巨人族は一体誰なのか』と質問した時、ヴァフスルーズニルは『はるか昔に、巨人ベルゲルミルが生まれ、その力ある巨人はスルードゲルミルの息子で、アウルゲルミルの孫なのである』と答えた。」

という調子である。

ホイジンガはこれらははるか過去の原始的謎解き競技のスタイルを引き継いでいると述べている。

 

オオムギのビールづくり:6000年前のヨーロッパでも

今日の新聞の記事のタイトルである。

オオムギをつかったビールつくりはメソポタミアなどで6000年前ごろから行われていたという記録があるがヨーロッパ(古ヨーロッパ)でも6000年まえごろから麦芽飲料が飲まれていたという話である。

大麦を発芽させると大麦の粒の最外層のアリューロン層細胞膜が薄くなる。この証拠を遺跡から発掘された陶器に付いていた穀物でも見つけた。これによって6000年前の古ヨーロッパでも麦芽が作られていた。

 

 

コンパイラPython:Pypyの実力

久ぶりにPythonの話題である。

インタプリタであるPythonは実行速度が遅い。この遅い原因を回避するためにPython言語で作ったプログラムをコンパイルして実行するPypyというコンパイラがある。どの位の性能があるか試してみた。環境はOSはwindows7で、使ったPythonおよびPypyのヴァージョンは
>>python -V
Python 3.7.6

>>pypy3 -V
Python 3.6.9 (2ad108f17bdb, Apr 07 2020, 03:05:35)
[PyPy 7.3.1 with MSC v.1912 32 bit]

例1:単純な四則計算


import time
start = time.time()

for i in range(100000000): # 10^8
    1 + 1
    1 - 1
    1 * 1
    1 // 1

process_time = time.time() - start
print(process_time)

結果は
Python3.7  4159ms
Pypy  95ms

となり、約40倍の速度向上が見られた。

例2:配列


import time
start = time.time()

A = [i for i in range(10000000)] # 10^7

for i in range(10000000):
    A[i] = 0

process_time = time.time() - start
print(process_time)

結果は
Python3.7  1844ms
Pypy  70ms

となり、約30倍の速度向上が見られた。

 

あそびと知識:「リグ・ヴェーダ讃歌」にみる

「われ、汝に大地の尽きるさいはてを問わん。われ、汝に大地の臍のいづくに在りやを問わん。われ、汝に雄々しき種馬の種につき問わん。われ、汝に弁論の最高の場を問わん。」

これはリグ・ヴェーダ讃歌(紀元前1200年ごろの最古のヴェーダ文献。バラモン教の最高聖典で1018の歌からなる)の第一巻164歌である。ホイジンガ著「ホモ・ルーテンス」ではこれを祭僧(バラモン)たちが祭儀の際におこなった「知恵比べ」がヴェーダの詩句として残されたものだとしている。

これは形式からも問いの内容からも禅宗の僧が行っている「禅問答」に大変に似ている。

「あそび」と知識

太古の人にとっては、何かを知っているということはそれ自体魔力であった。彼にとってはどんな知識でもことごとく世界秩序そのものと直接の関係があるからである。それ故に、祭祀におけるあそびとして力くらべなどの競技と同じく知識の競技が行われた。

ホイジンガ著「ホモ・ルーテンス」では祭祀の重要な一部であった「謎解きあそび」を古代インドのヴェータ文学から説く解す。

日本の祭りでも綱引きや相撲が祭礼の重要な一部となっている競技の例が多い。祭礼における「言葉あそび」としては「祭文(さいもん)」がある。

「相馬(そうま)」という地名

今朝りんごを食べようとしたらその「しなのゴールド」にラベルが貼ってあり「青森県産JA相馬村」と書いてあった。福島県の相馬以外にも「相馬」という地名があることが面白い。

「相馬」とは、馬市で市場で競りに掛けられた馬のコンディションを観ることで、相馬はそのような場所であったと思われる。

青森県の相馬村は弘前市に隣接した村であった。現在は弘前市の一部である。

WEBで「相馬」を検索すると、福島と青森以外に茨城と千葉にまたがる下総国・相馬郡という地名があったことがわかる。常陸を支配した相馬氏が下総の千葉氏の後裔であることを考えると、この相馬と福島の相馬とは何か繋がりあるのかもしれない。