読者です 読者をやめる 読者になる 読者になる

つらねの日記

プログラムの進捗やゲームをプレイした感想などを書き連ねる日記。

pythonでコロン区切りの物理アドレスを取得する

前置き

pythonでコロン区切りのMACアドレスを取得したいと思っていた.すると,

qiita.com

という記事があった.

しかしながら, struct というものを知らなかったので,さっぱり何がおきているのかわからない… そこで, struct を使わない形で書いてみるか,と考えた.

書いた

 ":".join([hex(n >> (5 - i) * 8 & 0xff)[2:].zfill(2)
          for (i, n) in enumerate([uuid.getnode()] * 6)])

uuid.getnodeは48bit区切りの物理アドレスを返すらしいので, それの下位8bitを取ってくる.

速度比較した

from time import time
import uuid
import struct

a = time()
for _ in xrange(1000):
    "-".join([hex(n >> (5 - i) * 8 & 0xff)[2:].zfill(2)
              for (i, n) in enumerate([uuid.getnode()] * 6)])
b = time()
for _ in xrange(1000):
    "-".join([hex(fragment)[2:].zfill(2)
              for fragment in struct.unpack("BBBBBB", struct.pack("!Q", uuid.getnode())[2:])])
c = time()
print b - a
print c - b

自作と本家,それぞれ1000回計測した.

結果

0.0104370117188
0.00326585769653

遅い,遅すぎるぜベイベー… 本家とくらべ,3倍近い時間がかかっている…

だがしかし

落ちついて,ソースコードの長さを見て欲しい.

":".join([hex(fragment >> (5 - i) * 8 & 0xff)[2:].zfill(2) for (i, fragment) in enumerate([uuid.getnode()] * 6)])
"-".join([hex(fragment)[2:].zfill(2) for fragment in struct.unpack("BBBBBB", struct.pack("!Q", uuid.getnode())[2:])])

なんと,4文字の減少が得られた!!すごい!!!

結論

やはり詳しい人のソースコードは素晴しいということが今回の一件から判った. 後でstruct に関しても理解を深めたい💪