massa142's blog

くり返す このポリリズム

「ハイパフォーマンスPython」を読んだ

ハイパフォーマンスPython

ハイパフォーマンスPython

Pythonの高速化技法について一歩踏み込んだプロユースの解説書。ボトルネックの測定方法から、最適なデータ構造の使い分け、CythonやPyPyなどのコンパイラの比較、numpyなどのパッケージの使い方、マルチコアCPUの活用法、メモリ効率を劇的に改善するトライ構造や近似計算まで、シンプルな実例プログラムを用いながらわかりやすく説明します。高性能なプログラムの書き方だけでなく、高性能なシステムの作り方を総合的に学ぶことができるPythonエキスパート必携の一冊です。

https://www.oreilly.co.jp/books/9784873117409/

ここにも書いてあるように、プロファイリングのやり方からデータ構造、Cコンパイル・並列並行処理など幅広い内容が扱われていた。CPython以外の実装について勉強しようと思ってこの本を読み始めたので、個人的には「7章 Cにコンパイルする」が特に面白かった。

また普段はI/Oバウンドなプログラムを書くことが多いので、RAM使用量の削減とかそのためのプロファイリングなどCPUバウンドなプログラムについての知見が得られてよい。

時間ができたら次は積ん読になってるCythonのやつを読もう。

Cython ―Cとの融合によるPythonの高速化

Cython ―Cとの融合によるPythonの高速化

読書メモ

3章 リストとタプル

  • リストは動的な配列
  • タプルは静的な配列
  • サイズが1~20の小さなタプルについては、使われなくなってもメモリがOSに返却されず、将来の再利用のために保持される
>>> %timeit l = [0, 1, 2, 3, 4, 5 ,6, 7, 8 ,9]
96.8 ns ± 1.22 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
>>> %timeit t = (0, 1, 2, 3, 4, 5 ,6, 7, 8 ,9)
16.4 ns ± 0.205 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

4章 辞書と集合

5章 イテレータとジェネレータ

def fibonacci():
    i, j = 0, 1
    while True:
        yield j
        i, j = j, i +j
def fibonacci_succinct():
    is_odd = lambda x: x % 2
    first_5000 = islice(fibonacci(), 0, 5000)
    return sum(1 for x in first_5000 if is_odd(x))
  • ジェネレータで省メモリで高速な処理が可能
    • 遅延評価

6章 行列とベクトルの計算

  • メモリ断片化

    • リストはデータそのものではなくポインタを保持している
      • どんな型でも格納できるのでたいていの場合では便利
      • ベクトルや行列の演算においては、著しい性能劣化の原因に
      • データをメモリ上の連続した1つのブロックとして扱うことができれば、データ全体を一回の操作で移動できる
      • データが断片化されていると、ブロック全体を移動できず、各位要素をばらばらに移動する必要がある
    • ループがベクトル化に対応していない
      • 一度に1つの要素を演算するループを、ひとまとまりのデータに対して同時に処理したい
  • numpy導入

    • 効率のよいベクトル化演算パッケージ
    • データを連続的なメモリ領域に保持し、ベクトル演算命令をサポート
    • +=*=などのインプレース演算は、入力の1つを出力として も使うから、計算結果を格納するための領域を確保する必要がない
    • numexpr

7章 Cにコンパイルする

  • AOTコンパイラ

    • Cython
    • Shed Skin
    • Pythran
  • JITコンパイラ

    • Numba
      • Continuum(Anaconda)謹製
      • @jitデコレータを付けるだけ
    • PyPy
      • GCのやり方が違う
        • CPythonは参照カウント法/PyPyはマーク&スイープ法
      • Cによる拡張ライブラリには効果がない
        • Pythonのコードを高速化するのが仕事
      • RAMの使用量が多い
  • CPython Compiler Tools
    • ここに色々まとまってる
  • PyPyはPython3・Numpy対応できるように進化しててすごい
  • ctypes
    • 外部関数インターフェース
    • 引数をCの型へキャストする必要あり
    • 複雑でメンテナンスが大変になりやすい
  • cffi
  • f2py

8章 並行処理

  • イベントループで並行処理を実現
    • 2つの考え方
      • コールバック
      • Future
  • gevent
    • http://www.gevent.org/
    • 標準 I/O 関数を非同期に変えるモンキーパッチ
    • 軽量スレッドで並行処理ができるGreenlet
      • 複数のCPUを使わずに、イベントループを使うことによって I/O 待ちの間にgeventのスケジューラがGreenletを切り替える
    • grequests知らなかった
  • tornado
    • http://www.tornadoweb.org/en/stable/
    • コールバックの方法を採用していたけど、バージョン3.xからは、互換性を保ったまま、コルーチ 風の処理が追加された
    • イベントループは全体で動作していて、非同期I/Oにかぎらず プログラムの実行の流れを制御している
    • geventはiwait関数が実行している間だけイベントループが動作
  • asyncio
    • asyncioライブラリは、tornadoやgeventのようなモジュールと組み合わせて、同じイベントループで動作させることも可能
  • やっぱり標準ライブラリがいいよね

9章 multiprocessingモジュール

  • embarrassingly parallel問題(あきれるほど 簡単に並列化可能な問題)
    • ジョブを互いに独立な単位に分割する
    • ワーカーによって計算時間にばらつきがあるのなら、処理の順序をランダム化することを検討する
    • 処理の遅い順に並べて、もっとも遅い処理から先に片づける
    • 検証された理由がないかぎり、デフォルトのchunksizeを用いる
    • チャンク数を物理コア数の倍数にすること
  • 可能なら自前で非同期システムを作るのは避ける
    • geventのような成熟したライブラリがbetter
    • 外部のキュー管理システムについてもCeleryとかを使おう

10章 クラスタとジョブキュー

11章 RAM使用量を削減する

  • テキスト処理アルゴリズム
    • トライ
    • DAWG(有向無閉路文字列グラフ)
  • RAM使用量を削減するコツ
    • 数値データを扱うならnumpy
    • ジェネレータを使う(Python2.x: xrange/Python3.x: range)
    • 大量のUnicodeオブジェクトを使うならPython3.3+
    • ビット列を太陽に使うならnumpy/bitarray
  • 確率的データ構造
    • 精度を犠牲にしてメモリの使用量を膨大に削減

2017年10月の振り返り

仕事

  • silkを使ってプロファイリング
  • N+1クエリを消していった
  • transactionの見直し
  • transactionの観点からよくないsignalをリファクタ
  • マルチスレッド処理で発生したギャップロックを解消
  • RemovedInDjango20Warning対応
  • 使ってないメソッドを掃除

アウトプット

ブログ

スライド

イベント

音楽

N/A

映画・ドラマ・アニメ

N/A

ラクロス

目標と成果

  1. ◯ Web連載執筆
    • 第1回分納品できた
  2. △ 書籍の第3章執筆とサンプルアプリケーション作成
    • 第3章は書けたけど、サンプルアプリできてない
  3. ◎ なんか本2冊読む
    • 「理科系の作文技術」「ハイパフォーマンスPython」「Angular CLIがわかる本」「逆引きwebpack」とか色々読み終えた
  4. × 出社チャレンジ頑張る
    • 改善できてきた気はするから11月に期待

11月に向けて

  • Web連載第2回執筆
  • 書籍のサンプルアプリケーション作成と第5章執筆
  • JS本執筆の準備
  • 出社チャレンジ頑張る
  • ライブに向けてBAND-MAIDの予習
  • Advent Calendarの準備
  • Real World HTTP読み進める
  • Rustの勉強を再開

「Angular CLIがわかる本」を読んだ #AngularCLIがわかる本

leanpub.com

Angular Japan User Group代表のlacoさんが、「Angular CLIがわかる本」という電子書籍を出版したので早速読んでみた。

lacolaco.hatenablog.com

目次

  • 本書について
    • フィードバックについて
    • 対応バージョン
  • Angular CLIの基礎
    • Angular CLIとは
    • はじめてのAngular CLI
    • Angular CLIの学び方
  • Angular CLIを使いこなす
    • ng newを使いこなす
    • ng generateを使いこなす
    • ng buildを使いこなす
    • ng testを使いこなす
    • E2Eテストの実行
    • Lintの実行
  • Schematics
    • Schematicsの概要
    • ng generateコマンドを拡張する
  • ng ejectとwebpack
    • ng ejectコマンド
    • @ngtools/webpackモジュール
  • インテグレーション

感想

  • Angularの基本的な使い方・オプションを体系的に復習できた
  • stories · angular/angular-cli Wiki · GitHub にある内容を、かいつまんで説明してもらえてよい
  • Angularのチュートリアルやったことある人なら理解できる内容だったと思う
  • Schematicsを使ってng generateのカスタマイズという話は初耳だったんで、勉強になった
  • 量もほどほどで1時間ちょっとで読めた
    • "この本は 55%完全です"ってあるから、今後ページ数も増えていくのかな
  • "取り上げるユースケースも順次増やしていく予定"とのこと
    • 実践的な話をもっと読みたいから楽しみ
  • 登録料分すぐに売れて、lacoさんのモチベーション高まってよかった

おわりに

うん「Angular〇〇がわかる本」他にも読みたいから、シリーズ化に期待!

PyLadies Tokyo - 3周年記念パーティ に参加してきた #pyladiestokyo

はじめに

2017/10/15に開催された PyLadies Tokyo - 3周年記念パーティ に参加してきたので、その参加メモです。

pyladies-tokyo.connpass.com

PyLadies Tokyo

https://pyladies-tokyo.connpass.com/

PyLadies Tokyo は,PyLadies の東京(or 日本!?)支部として,女性 Pythonista (=Python利用者) を繋ぐために活動しています.

普段は女性Pythonistaのコミュニティですが、周年記念のパーティの時には男性も参加できるのです。

参加動機

  • PyLadies Tokyoのメンバーと一緒にPyCon APAC 2017 in Malaysiaへ行って来たのがきっかけ

massa142.hatenablog.com

  • PyLadies Tokyoメンバーによるレポートはこちら

LTしてきた

slideship.com

  • 先月開催したPyCon JP Reject Conference 2017について
  • みんなに聞いていった「落選した理由」から探るCfPアンチパターン
  • たまたまkame-chanが「周りのPyCon JPでtalk当選したことがある人に応募のコツを聞いてみた」というLTだったんで、バトンタッチができて楽しかった

パーティの様子

全体を通しての感想

  • はじめてPyLadies Tokyoに参加したけど、あったかいコミュニティで居心地がよかった
  • スポンサーのRetty・Google Cloud Platform ありがとうございました!
  • @a_macbeeが体調崩して来れなかったの残念
    • 東京と沖縄の温度差にやられたらしい...
  • 2次会でいろいろ話せた
    • @maaya8585とJava9・Azureについて
    • @atsuoishimotoと表参道勤務あるあるについて
    • @miとDjangoについて
  • PyCon JP 2017に参加して悩みが解決したとか、刺激を受けて自分もやってみたという、PyCon JP 2017のテーマである「Output & Follow」なLTが多くてとても嬉しかった
  • めっちゃ遅刻したけど糖質たくさん買ってくる@usaturnかっこいい
  • 煽ったらちゃんと来てくれる@iktakahiroもイケメン

おわりに

祝 3周年 🎉🎉🎉

来年の4周年パーティぜひまた参加したい。

f:id:massa142:20171017143551j:plain

「理科系の作文技術」を読んだ

理科系の作文技術 (中公新書 (624))

理科系の作文技術 (中公新書 (624))

読んだ動機

  • 技術文書を書く機会をいただいた
  • @terapyon@takanoryがすごくお薦めしていた
  • ずっと読まなきゃと思いながら積ん読してたけど、いざ原稿のレビューで論理構成などの指摘を受けると「これはやばい」と感じて慌てて読んだ

悩んでいたこ

自分が文書を書いていて悩んでいたことや、レビューで指摘してもらったことに以下の点があった。

  1. 読者に伝えたいことがぶれる
  2. 「文章を区切りすぎるとMarkdown・Qiitaっぽい感じになってよくないのでは」という不安から、冗長な修飾節をいれてしまう

勉強になったこ

目標規定文

準備作業を無視して、いきなり書き始めるところに、多くの失敗の原因があると述べられている。

この準備作業のひとつに目標規定文の設定がある。

自分は何を目標としてその文書を書くのか、そこで何を主張しようとするのかを熟考して、それを一つの文にまとめて書いてみる

この文が目標規定文である。目標規定文が決まったら、そこに収束するように文章全体の構想を練ることで一貫した文章を書くことができる。

目標規定文の例として、以下の文章が紹介されている。

このレポートでは、ランダムな変動を考慮に入れても、1970年代にはいってからは春がくるのがおくれ、また春が寒くなりつつあることを示す。

読者に伝えたいことがぶれていた原因は、この目標規定文を設定・意識できていなかったためだと感じた。これからは文章を書き始める前に、準備をしっかり行いたいと思う。

文の構造と文章の流れ

英語の論文では、

(a) 逆茂木型の文章を書いてはいけない
(b) 少々くどいと思っても論理の鎖の環をはぶいてはいけない

という。

逆茂木型の文章とは

  • 文の相互の連関がパラグラフ全体を読んだあとではじめてわかるような文章
  • 論述のわき道にいることがその話が終わってからでないとわからない文章

のような論理構成が明確ではない文章のことである。

日本語の文では、(a)の要求を完全にみたすことに多少の無理がある。また、(b)に忠実にしたがうと在来の日本語の文章のゆかしさをそこなう場合がある。しかし、理科系の仕事の文章は、(a), (b)の要請をみたすように書くべきだと本書では述べられている。

この指摘にしたがって、変な心配はせずに冗長で不必要な表現は可能な限り削っていこうと思う。書いた後に読み返してみて自分でも「ちょっと変かもしれないけど、まあいいか」という文章は、だいたいレビューで指摘されているので、もっと自分に厳しくチェックしていかないといけない。

おわりに

「理科系の作文技術」を読んで、文章の論理構成という面がとても勉強になった。論文のようなアカデミックな文書を意識している内容もあるのですべてを読む必要はないと思うが(特に9章以降)、作文の基本を教えてくれるとても良い本だった。

@terapyonからもう一冊ロジカル・ライティングという本を借りているので、次はこっちを読んでみようと思う。

ロジカル・ライティング (BEST SOLUTION―LOGICAL COMMUNICATION SKILL TRAINING)

ロジカル・ライティング (BEST SOLUTION―LOGICAL COMMUNICATION SKILL TRAINING)

読書メモ

2章 準備作業(立案)

2.1 準備作業の必要

  • 理科系の仕事の文書に関しても、準備作業が必要
  • それを無視して、いきなり書き始めるところに、多くの失敗の原因がある

2.2 文書の役割の確認

  • 自分の書こうとする文書の役割を確認することが第一の前提
  • いったい読者はこの文書に何を期待しているはずか

2.5 材料あつめ

  • 思いつくままのメモ
  • 図・表
    • フリーハンドの図で十分

3章 文章の組み立て

3.2 序論

  • 序論の使命は読者を本論にさそいこむ、読者が抵抗なく本論にはいっていけるように準備をととのえることにある
    • 読者が本論を読むべきか否かを敏速・的確に判断するための材料を示し
      • 目標規定文を第1文としてOK
    • またほんとんにかかる前に必要な予備知識を読者に提供する
      • 本論の主題となる問題は何か
      • その問題をなぜ取り上げたか
      • その問題がなぜ重要か
      • 問題の背景はどんなものか
      • どういう手段によってその問題を攻めようとするのか
  • 序論はみじかく、みじかくと心がけて書くべき

3.3 結び

  • いちど書いたことは再びくりかえさず、どうしても必要なことだけを書き終わった途端に文章が終わるのが通例になってきた
    • 現代的重点先行主義
    • 「なくてもすむことばは一つ残らず削れ」
    • 客観主義

6章 はっきり言い切る姿勢

  • 「であろう」「と思われる」「と考えられる」などのあいまいな、責任回避的な表現は避けて、「自分は・・・と思う」「・・・と考える」と書くべき

8章 わかりやすく簡潔な表現

8.1 文は短く

  1. まず、書きたいことを一つ一つ短い文にまとめる
  2. それらを論理的にきちっとつなげていく
  3. いつでも「その文の中では何が主語か」をはっきり意識して書く
    1. 主語を文字に書き表すことはかならずしも必要ではない
    2. しかしいつも明確に意識していなければならない

2017年9月の振り返り

仕事

  • 設計の見直し
  • せっせとリファクタリング
  • SQUEEZE 3周年!
  • 自社ホテル「Minn」グランドオープン!
  • PyCon JP 2017でダイアモンドスポンサーやってきた!

アウトプット

ブログ

イベント

音楽

N/A

映画・ドラマ・アニメ

ラクロス

  • リーグ戦第6戦 vsRAGGAMUFFINS 13-5 WIN
  • 入替戦 vsVIKINGS 10-7 WIN
  • プレーオフ第1戦 vsVALENTIA 8-7 WIN
  • いくぞ クラブ選手権!!!!!

目標と成果

  1. △ Web連載執筆
    • なんとかドラフトは書けた
  2. ◯ 書籍第1章執筆
    • 第1章はとりあえず書けたのでよしとする
  3. ◎ PyCon JP 2017楽しんでくる
  4. 入れ替え戦に勝つ
    • 一部復帰!最高!!
    • 今年の取り組みが報われて本当によかった
  5. Perfume FES!!参戦

Perfume FES!! 2017 w/ 星野源 #prfm

Masataka Araiさん(@massa142)がシェアした投稿 -

10月に向けて

  • Web連載執筆
  • 書籍の第3章執筆とサンプルアプリケーション作成
  • なんか本2冊読む
  • 出社チャレンジ頑張る

徒然

  • 9月はSQUEEZE3周年・RejectCon・PyCon JP 2017・ラクロスPerfumeとかなり忙しかった
  • けやき坂スタバを知ってから執筆作業が捗りはじめてよい
  • 10月はもっと勉強する時間を確保したい

「Pythonエンジニア ファーストブック」を読んだ #pyfirst

Pythonエンジニア ファーストブック

Pythonエンジニア ファーストブック

この度2017/9/9に発売された「Pythonエンジニア ファーストブック」を献本頂きました。

Pythonエンジニア」としての仕事の全体像を理解して、本格的な開発に取り組むためのさまざまな、そして最新の知識を解説しています。本書だけでPythonによる開発のための知識がすべて得られるわけではありませんが、少なくとも、しっかりとした助走をするためにはとても有効な内容ではないかと思います。

本書の「はじめに」にある通り、仕事でPythonを使う最初の一歩にふさわしい内容となっています。

これらのフレームワークやライブラリは仕事でよく使われているものですが、まだまだ日本語でのまとまった情報が少なく入門書を待ち望む声をたくさん聞いてきました。

このファーストブックではそれらの解説がコンパクトに1冊にまとまっているので、Python基礎を習得した人や他言語での開発経験がある人などなど多くの方々に有益な内容になっていると思います。

また、データ分析やWeb開発の章ではスクレイピングの章で実際に収集したデータを使っており、ここでも実際の業務の流れを体感できるような構成となっています。

ちなみに本書は2015/4発売の「Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)」の改訂なのですが、多くの内容が加筆・追加されていており全然違うものになっているという印象です。

以下、本書内で記されている「Pythonエンジニア養成読本」からの変更点を紹介しておきます。

  • 対象となるPythonのバージョンを2.7から最新の3.6に更新
  • 第4章に新たに「スクレイピング」を書き下ろし
  • 第5章「PyData入門ガイド」は、パッケージ紹介主体の内容から、パッケージを活用してスクレイピングしたデータを解析するという構成に変更
  • 第6章「Webアプリケーション開発」では対象とするWebフレームワークをシンプルなBottleから、より本格的なWeb開発に使用できるDjangoへ変更
  • 仮想環境の構築方法をvirtualenvから、Python3系標準のvenvに変更
  • 各種ライブラリ、ツールのバージョンを最新に更新
  • Ansibleの章を削除

Pythonエンジニアの入り口として、基礎を習得した次のステップとしてお薦めできる一冊です!

その他の感想

第1章 Pythonの動向

  • Pythonの文化や歴史が丁寧に紹介されている
  • コミュニティもたくさん紹介されていて嬉しい
  • 今回の改訂に伴ってPystonが消えてる…
    • Dropboxがサポート打ち切ったからだろうか
  • 個人的には一番好きな章

第2章 最低限知っておきたいPython言語の基本

  • Python2.7からPython3.6にUpgrade
  • ほかは養成読本から変更なしかな

第3章 開発環境とチーム開発

  • Python3.6に合わせてvirtualenvからvenvに変更
  • ここもほかは養成読本から変更なさそう
  • emacsユーザーがPyCharmについて書くの大変そうだった

第4章 スクレイピング

  • まずはRequestsとBeautiful Soup4でやってみる
  • ページングとかあるとめんどいよねっていうことでScrapyの解説
  • Scrapyのインストールでハマりそうなところも丁寧に書かれていてよい
  • レゴサイトが題材になってるのは著者の趣味だな

第5章 PyData入門ガイド

第6章 Webアプリケーション開発

  • Django!!!
  • Bottleに比べて多機能で覚えること多くなるけど、実際にlocalhostで動かしながら読んでみると理解しやすいと思う
  • Djangoの公式Documentを片手に読むのがオススメ