工作室」サイトの日記的なブログです。サイトに挙げなかった他愛ないことを日記的に書き残してます。工作室」topに戻ります。arduino別館」topに戻ります。PythonあいかわらずのPython3、Pillow、tkinterで画像処理のプログラムの実験。結果的には、やっぱりロジック自体は一瞬で処理が終わる内容になってたことが確認できた。長かった...どこで時間が掛かってるのかを突き止めるのに、使ってたPython3実行環境の絡みなんかもあって、いろいろ惑わされていたんだな。最終的な解決に至るまでの実験結果を纏めておく。そもそもPythonのリスト形式の処理が、一般的に遅いのかどうかを、リストの初期化やコピー処理なんかを通して(実メモリへの読み書き)、どのくらい掛かるのかを眺めてみる。テストのコードは、まずこんな。Pythonの2次配列のリスト「a」を初期化する処理と、その初期化に使う関数「f」の定義。動かすと、ちゃんとリストに値が設定されている。この関数「f」を流用して、でかいリストに値を設定してみる。「a」や「b」の初期化に、VirtualBox上のLubuntuで10秒くらい。大体16Mピクセルくらいの画像に相当。これを行ってから、「b」に「a」の値を1個1個コピーしていくループを実行してみると、実測で16秒くらい。ことは、例のオレオレロジックでは30万画素相当で10秒くらいかかってしまっていたのに対して、この単純にリストを1600万画素相当で読み書きするのに10秒くらいで終わってるんだから、リストの読み書き処理自体はやっぱりそれなりに速いことが判る。遅い原因は、どうやらリストの読み書きそのものではない。数秒単位で時間が掛かっちゃう。実験用の画像処理プログラムの中で時間が掛かっているのかなぁ、ホントかなぁ、と、ぼんやり考えてみて、ふと思い出す。IDLEって、テキスト文字の表示処理、結構遅いんだよなと。CLIのLinux環境だと、printで標準出力に吐き出しても、スクロール処理含めて一瞬で大量に表示できるけど、ILDE上のコンソール画面だと、目で追える位の遅さだった記憶が。そもそもループでprint文の表示を行ったらどのくらい時間掛かるのかをやってみた。...480行分表示するだけで、数秒掛かってる...。お前か!!犯人は!!というわけで、このprint文で処理中の行を表示する所をコメントアウトして実行してみると、一瞬で処理が終わる。Arduinoより遅いって、考えにくいもんねぇ。Quad)が、Arduinoより速いってことがわかって一安心。→IDLE環境のコンソール表示の遅さによるものということだったらしい。この点はとりあえずクリア。ひとつ遅くなってた原因の、平方和の平方根の方は、別途なんか考えないといけないんだよな。画像上の4つの代表点から、対象ピクセルまでの距離(ユークリッド距離)を計算して、その近さに応じてバックグラウンドの影響を加味しているんだけど、そのユークリッド距離を求めるには、単純には平方和の平方根が必要。それを近時するなり、計算を単純化するなりできればいいんだけどなぁ。C言語なら、有効桁とか考えて、整数型で適当に丸め上げるとか、色々出来ると思うんだけど、Pythonの型って、いまいち自由自在にはならないしなぁ。8801マシン語入門が出てた。ベーマガの方は、創刊号の翌々月のやつだな。ちなみにこのマシン語の本。オイラがZ80のお勉強するために買った本だな。PC-CLUB)を使うようになってからは、まったくというほど弄らなくなってしまって、もう勘所がなくなってしまったんだよな。レジスタの直交性の低さは、慣れてないとなかなかプログラム組みにくい。普通の人では理解が難しく、それが原因でトラブルが発生したものと考えられています」なんて話になったりするんだな。https://twitter.com/koutyan6595/status/1087874031498358785よくできたコントだな。https://trafficnews.jp/post/82695この、音声波形公開しちゃったっていう件。自衛隊の哨戒能力云々がある程度推し量れちゃうのもあれだけど、それ以上に、全世界にレーダーの信号波形を公開されちゃったっていうのって、潜水艦や戦艦がキャビテーションノイズをサンプリングされちゃうのと同じくらいアレなことなのかなぁ、って気がする。事実上の敵国である北朝鮮にも当然その情報は拾われているだろうから、この波形が来たら、”あの船から火器管制レーダー来た!”ってバレバレになるという。ある種この戦艦は丸裸にされたようなものといっていいんだろうな。https://twitter.com/HacksterPro/status/10878332946858147854輪車だと思ったら、四足で歩き回る。https://twitter.com/Hacksterio/status/1088185528204386312リアクションホイールを使うドローン。ドローンみたいに、空気中で、重力も働いているような状況なら、振り子みたいに重いものが自然と下に行くだろうから、こういうリアクションホイールでも大丈夫なのは判るんだけど、KSPみたいな宇宙開発シーンだと、微妙にバランスが崩れたままの状態を、リアクションホイールでバランス取り直し続けるって用途に使うと、ホイールの回転速度が無限大に発散してしまうんじゃないかなぁ?って、素朴な疑問があるんだよな...。例の「フロムザレイス」では、作った飛行機の姿勢を制御するのに、リアクションホイール使って飛ばしていたんだけど、あれ、水平飛行ですら、常に機首上げし続ける必要があるだろうから、リアクションホイールが無限大の角速度で回らないといけないんでは?と心配してた。PythonPython、Pillow、tkinterでゴニョゴニョやってるアレ。昨日、Windowsで動かしてみてやっぱり結構な処理時間が掛かっちゃうのが、なんか腑に落ちなかったので、あらためて、プログラムの頭からウォークスルーをしてみることにしてみた。640×480ドットって、30万ピクセルだから、それで10秒も掛かってるってことは、1ピクセルあたり30ミリ秒くらい掛かっちゃってる計算。そんな重い処理してるつもりないし、そのくらいの速度なら、メモリさえ足りればArduinoでも出来そうじゃね?と思ってるので。処理内容的には、評価値を1個参照して、それが閾値よりも大きいか小さいかを判断して、ドットを打つというだけの処理。それと遅い遅いといわれているPillowのputpixelメソッドで描いていくというだけの処理。putpixelだけでループをすると、1秒掛かるか掛からないか、というぐらいかな。残りはいったい何やってるの?と。putpixel以外で10秒ほどのほぼすべてを食ってると思ってよさそう。評価値と閾値って言っても、1個手前の計算結果を元に、差分使って積数の計算しているだけなので(積数を毎回forループで計算してるわけではない)、メモリアクセスはせいぜい数回してるだけ。ミリ秒も掛からないだろう?と。いざ1ステップずつコードを起動直後から眺めていくと、ふと、1ドット1ドット毎、ある関数を呼び出していることに気づいた。これ、仮に置いておいた関数(あとでちゃんと作り直す)で、その中で平方和の平方根(sqrtを1回、powを2回)使ってる。それが1ドットごとに4回計算されてる。思って、ここを計算式取っ払って、仮の値に置き換えてみる。...うん、速くなった。速くはなったんだけど、まだ4秒くらいかかっちゃう。1ドットあたり10ミリ秒以上かかっているくらいの計算だなぁ。あと一桁二桁速く処理できないの?じゃないと、もっと大きい画像扱うのには、速度が足らなさすぎる。if文が遅いのか、それともメモリアクセス全体的に遅いのか...?リストのアクセスって、やっぱ遅いのかなぁ?なんて思って、ちょっと検索。https://qiita.com/pegasusBS15/items/75da968c9d3ee285f851https://qiita.com/shaka/items/f180ae4dc945dc7b9066決定打は見つからないなぁ。リストのアクセスが、実際にどのくらいの速度が掛かるものなのか、実験プログラムでも作って調べてみるかなぁ?それにしても、実験中にあれこれしてたときに、あれこれLubuntu環境と行ったり来たりしてて、Lubuntu上のsambaでファイルやり取りしてたんだけど、なんだかおかしい。Windows10上のVirtualBoxで動かしているLubuntu上のsamba。母艦であるWindows10からアクセスが出来ない。Updateだろうと思うんだけどなぁ。smb1は使ってないはずなんだけどな。http://blog.livedoor.jp/nichepcgamer/archives/1073650652.htmlそれらしいことが見つからない...。Updateと称する月例ウィンドウズダウングレードは、ろくでもないことしまくってるなぁ。曲がりなりにも有料ソフトだろう...https://twitter.com/kantamizutamari/status/1086578012265443328チャーハン。相変わらずアルコールストーブをaliexで物色してる。https://ja.aliexpress.com/item/-/32915060438.html安いんだけど、蓋が無いから、途中で火を止めて、燃料をボトルに戻すってことが出来ないつくりなんだよな。https://ja.aliexpress.com/item/b-1/32850619856.html五徳が一体型なので、これは便利そう。薄型(高さが低い)でもいいんじゃないの?という感じもする。持ち運びと安定性の観点で。https://ja.aliexpress.com/item/-/32885617952.htmlこれも蓋は無いけど、ウィンドシールド付いてて、なかなかのアイデア品って感じでいい。https://shmineta.com/?p=3030トランギアっぽいデザインで、蓋があって、火力調整も出来て、コンパクトにたためる(or平べったくできる)ウィンドシールドが付いてるとばっちりなんだけどな。Edisonhttps://twitter.com/tanakh/status/1087288582329364480Intel、Quarkの製造やめちゃうみたい。CPU作ったのにもったいないよなぁ。なんか、IoT向けにクソまじめに作りすぎたんじゃないかなという気がするんだよな。Pentium世代のマルチメディア系命令まで対応してた(記憶では...たしか)んだから、MS-DOSが動く環境なんかも用意して、マニアックなギークが遊べる感じにしておけば、ジワジワ浸透しながら意外な方向まで発展してたかもなぁ、なんて妄想してた。32ビットに限定しちゃったところに限界があったりしたのかなぁ?逆に。IoTは、ARM一辺倒になっちゃうのかな?それともRISC-Vあたりが対抗馬に成長したりできるのかなぁ?Python3、Pillow、tkinterで作ってる画像処理のGUIプログラム。VirtualBox上のLubuntuで動かしてみた時に、画像1枚10秒くらい掛かっていたのが気になっていたので、仮想環境じゃなく、Windows7上のIDLE3で動かしたら、もっと速く動くのかなぁとか思って、ちょっと実験。tkinterは最初から入ってるけど、Pillowは入ってないので、まずPillowを入れてみる。https://choineta.net/135.html入った。