BETA

Python日記(2)

投稿日:2018-12-16
最終更新:2018-12-16

辞書型とCの2次元配列はほぼ同一視できる

ことに気づいた。
Cというのは配列を多次元で作れるので、例えば2次の正方行列計算を数学ライブラリ(math.h)なんかが無くてもやろうと思えば一応できる。スカラー数とは乗除計算が全然違うので、その部分が面倒だけど。まぁ自分の用途で行列計算なんてのは無いんだけど、むかーし大学で勉強してたときはそういうのを題材にしてたのでこんな視点でつい見てしまうというだけ。

使い勝手はだいぶ違う

とは言いつつ、Python辞書型とC多次元配列は使い勝手がだいぶ違うと思っている。ことforループに関しては圧倒的な差がある。単純な1次元配列について考えてみると・・・

  • Cで配列の中身全てに対する処理をする場合
    char list[5];   ←必須。0番~5番まで、6個の要素を持つ配列の宣言。データは任意文字と仮定  
    for (i=0;i<=5;i++){  ←配列の要素数でループを回すのが一般的。  
     printf("\c\n", &list[n]);  
    }  
    というように、配列の要素数が定数で定義できるならこれで良かった。動的になっている場合はちょっと面倒で、ポインタを用いて配列にデータを入れていくことになるのでlistをchar型ポインタとして定義する必要があった・・・はず。もっと言うと、関数に対して配列の値渡しができない。構造体のメンバにしてからだったらできるんだけれど。
  • Pythonで辞書の中身全てに対する処理をする場合

    for tmp in dict:  
     print(tmp)  

    辞書型変数dictの宣言は必ずしも必要ではないし、ループの作り方次第ではループ変数の上限値を決める必要すら無くなる。

    何が幸せなのか

    これらの違いのどこに幸せ成分があるのかというと、やはりループ変数が配列の要素数を超過してセグメンテーション違反(だったかな)になることがほとんど無いことにある。もちろんCのように配列の要素数を気にしてループを作れば同じようなエラーは起きえるけれど、そのやり方が必須でないのであれば無理に使う意味も無い。そんなことに気づいた。

    辞書型でJSON処理することの難しさ

    ところでboto3のようなライブラリは返り値をJSONで返してくる。Pythonは適当な変数でそれを受け取ると自動的に辞書型として扱ってくれる。良い意味で忖度してくれるのが、Pythonの長所だ。
    でも、結果の入っている辞書型変数をforループやif文によって必要な所の抽出を行っていると、時々「このループではJSONのどのレベルを起点にしているんだっけ??」となることがある。コードを書いている自分ならまだ何とかわかるけれど、他人に渡したときのことを考えると早々に対応を考えなければならない・・・と考えている。例えば・・・

    • 必ずJSONのルートレベルから1段階ずつループする
    • 必ずJSONのルートレベルから、扱いたいレベルまで直接入る
    • 必要なレベルごとに変数を用意する

    のように、対応の方法はある。しかしコードが煩雑になる、変数が増えてメモリ消費量が増えるという副作用も当然ながら考えなければならない。恐らく最も効率的なのは「扱いたいレベルまで直接入る」ものだろう。昔と違ってメモリが潤沢な時代だけれど、無尽蔵というわけではないから節約も重視しなければならない。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@exstrz'の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!