JUGEMテーマ:電子工作

ESP32のmicropythonにてLCDビットマップディスプレーに文字を出力する際にデータ操作で困った話。bytearray

 

python全般なんですが、文字列操作とか、+ でつなげたりできて便利なので

普通にバイナリデータ定義してループの奥底で末尾につなげる処理を書いたんですが、
これが遅いのなんのって。

 

data = b""
for 
  for 
    for
      data=data+rgb

 

そんでですね。色々調べたところによると、代入する場合に新たにメモリを取り直すとの事でして。orz...

 

c言語脳の自分としてはそんなあほな処理あるかいなーって思うわけですが、
最近のコンピューターの性能の進歩もあり、そんな思想でも普通は気にならないぐらいのスピードで動いてくれちゃったりするので、
pythonさんには感謝感謝なんですが、ESP32ぐらいまで処理性能が低くなると。

 

いや、ESP32はチョッ速です。なんたって、python動きますし。atmega328あたりに比べれば、クロック周波数10倍ですしメモリも問題なく。

 

とはいえ、ループの奥底で1バイトずつデータを足したいみたいな場合に代入のたびにメモリを確保する様な重い処理が入るのは
さすがに無理。って訳で聞いてみました。google先生。

 

google先生曰く、前もってmallocの様にメモリを確保しておいて、後から内容を変更できるのじゃ!!

ってことでしたのでこう書いてみた。

 

write_count=0
data = bytearray(size)
for 
  for 
    for
      data[write_count]=rgb
      write_count = write_count + 1

 

これだと、代入の時にいちいちメモリを確保しなおすことはなくなるみたいです。
代入の処理部分を見てもいまいち処理の違いがピンとこないのはアレですが、
bytearrayに感謝ですね。

 

参考

https://micropython-docs-ja.readthedocs.io/ja/latest/reference/speed_python.html#ram-allocation