マルハナバチ、葉をかみ開花促す

今朝の新聞に表題のような記事があった。

我が家の畑のブルーベリーにもハチが来ていた。

新聞記事はこの花に集まるハチの話である。スイス工科大学のフォテイニ・バスカリデゥ博士が偶然に見つけたマルハナバチの行動である。マルハナバチが植物の葉を噛んでることを見つけ、その植物の開花が他より早くなるということだ。これは実験室にいたハチであったが野生のマルハナバチにも見られる。

ヒトの手で植物の葉を傷つけても何も変化が見られないことから、博士はマルハナバチが葉を噛むときに何らかの化学物質を放出しているのかもしれないとコメントしている。

スレッド・コンカーレント・Pythonコンパイラ

Pythonで書いたプログラムを高速に実行する仕掛けを調べていたら面白い記事に出会った。そこで公開されているプログラムを紹介しつつ、僕のところで実行した結果を示す。

基本になるプログラム(killing_time.py)は以下のようなものである:


import time


# 単に時間がかかるだけの処理
def killing_time(number):
    return_list = []
    for i in range(1, number + 1):
        if number % i == 1:
            if i <= 9999:
                return_list.append(i)
    return return_list


start = time.time()
num_list = [25000000, 20000000, 20076000, 14500000]
for n in num_list:
    result_list = list(killing_time(n))
stop = time.time()
print('%.3f seconds' % (stop - start))

このプログラムを実行してみた。使った環境はwindows 7でPyhtonのヴァージョンは3.7.6である。
実行結果は
5.763 seconds
このプログラムをスレッド化したもの(killing_time_thread.py)がある。プログラムはここ
実行結果は
5.779 seconds
となり、Pythonスレッドは速度向上には繋がらない。
またこのプログラムを並列処理させるようにしてみる(killing_time_concurrent.py)。プログラムはここ(CPUの最大数は4)。
実行結果は
3.703 seconds
となり、実行速度は若干改良される。
ここまでがオリジナルの記事を追試したもので記事の結果をほぼ再現した。

次にこの三つのプログラムをPythonコンパイラ(pypy)で実行させてみた結果を述べる。pypyのヴァージョンは
Python 3.6.9 (2ad108f17bdb, Apr 07 2020, 03:05:35)
[PyPy 7.3.1 with MSC v.1912 32 bit]
実行結果は


killing_time.py -------------> 0.713 seconds
killing_time_thread.py) -----> 0.462 seconds
killing_time_concurrent.py --> 1.049 seconds

となった。なにも手を入れないプログラムでもコンパイラで実行するとかなりの実行速度向上ができることが分る。

pypyはnumpyモジュールなどの拡張モジュールとの相性が悪い。しかしネイティヴPythonのみを使ったプログラムは高速に実行できる。

ネコを興奮させるイヌハッカ:祖先が失った成分復活

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

ネコを興奮させるイヌハッカ(キャットニップ)の誘引成分はイリドイドという化学物質の一種である「ネペクラクトン」と呼ばれている物質たそうである。ネコの3分の2はキャットニップをこすったり触ったりして興奮状態になる(因みに我が家で以前に飼っていたネコは無反応)。

記事の内容は米フロリダ自然史博物館の研究グループがキャットニップが持つこの成分の由来をこの成分を持たないヤナギハッカのゲノムを比較するなどして祖先の酵素と遺伝子を調べたというもの。

その結果、6500万~5500万年前ごろ祖先の植物がイリドイドを作る能力を失ってしまったが、2000万年ごろキャットニップは再びイリドイドを作る能力を復活させたということが分った。

空白の時代(5500万年前~2000万年前)ではイリドイドを持つ必要のない環境であったのかもしれない。

Pythonで作った高速ライフゲーム

最近亡くなったコンウェイ(John Horton Conway)が提唱したライフゲームを高速に実行するPythonプログラムの話である。

この「ゲーム」はセル・オートマトンの一種で二次元格子にオートマトンを置きその時間変化を追い、描画する。各格子のセルオートマトンの状態は生(1)か死(0)の二状態をとる(ライフゲームの由来?)。各格子の状態変化は当該のセルの状態と周囲のセルの状態によって決まる。ここの状態変化の計算は超並列に行うことができる。

計算式は極めて簡単でPythonでも実行時間は掛からないが、格子の数が増えるとセルの状態を描画する時間がバカにならない。そこで描画をヴィデオデータにしてしまってそのデータを画面表示する。こんなことを考えて調べていたら、同じようなことを考えているヒトがいてプログラムを公開している。かなり高速なシミュレーションができる。使ったプログラムはここ。セルの数は300X300=9万である。

実行結果

High_speed_life

イセエビの出す音、3キロ先で聞こえる

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

イセエビは頭のところから突き出ている長いひげ(第2触覚)の根元にある器官から「キイキイ」という音を出す。これはイセエビ同士のコミュニケーションに使われている。この音がどの位遠くまで届くのかフランスの研究者たちが調べた。

大きさが異なる24匹のヨーロッパイセエビを使い、イセエビから100mの距離のところまで8個の水中マイクを設置し音をを収録した(多分大きさの異なるイセエビは異なった周波数の「キイキイ」音を出すので個体を区別できたのだろう)。解析の結果、2.6cmと小さいイセエビは10mしか届かない、一方13.5cmの大型のイセエビは100mまで届くことが分った。

実験は浅瀬の雑音の多い環境だったこととイセエビが本来生息する環境を比較すると本来生息する環境では大きなイセエビの「キイキイ」音は3キロメートル程度は伝播すると研究者たちは結論した。

TKinterの拡張:ヴィデオを見る

Pythonに同梱されているTKinterはあまり苦労しないでGUIのPythonアプリケーションが作れる詳しい説明はここ)。アプリケーションで静止画像を見せることなどは追加のモジュール無しでできる。そこでTKinterアプリケーションでヴィデオを見せることができるか調べてみた。

  • オンラインのヴィデオカメラで撮影している映像をTKinter内で表示る方法

映像は毎秒60コマで更新されるのでこの頻度で映像を取り込み表示すればよい。取り込んだ映像はlabelウィジェットに表示する。プログラムはここ

  • 動画ファイルを読み込み表示する方法

映像によってフレーム・レイト(毎秒のコマ数)が異なるのでそれを反映した頻度で画面を更新することが必要である。また大きな画面サイズの動画は再生速度が足らなくなる問題がある。プログラムはここ

実行例

TKinter_video_file

この二例でみるようにTKinterは充分でヴィデオ・データにも対応できる。

コンパイラ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の動画撮影にはハイスピード撮影モードもあるので次回はそれを試すことにしたい。