Volo di notte

お勉強の成果メモや日常のこと

[Python] MultithreadingとPandas

DDE通信などIO待ち時間が大きい処理をPandasと組み合わせてマルチスレッド化。テンプレだけ作って解説は後日。

# -*- coding: utf-8 -*-
from queue import Queue
from threading import Thread
import pandas as pd

class TWorker(Thread):
    def __init__(self, queue, res):
        Thread.__init__(self)
        self.queue  = queue
        self.result = res

    def run(self):
        while True:
            arg0, arg1, arg2 = self.queue.get()
            
            # 処理
            res0  = arg0
            res1  = 1
            res2  = 2
            res3  = 3
            
            self.result.put([[res0, res1, res2, res3]])
            self.queue.task_done()

def MainTask():
    ColumnNames = ["COL0", "COL1", "COL2", "COL3"]

    df = pd.DataFrame([],columns = ColumnsOPTBL)
    queue  = Queue()
    result = Queue()

    for x in range(8):
        worker = TWorker(queue, result)
        worker.daemon = True
        worker.start()
    
    for param in [0, 1, 2]:
        queue.put((param, 1, 2))

    queue.join()
    while not result.empty() :
        res = result.get()
        df  = df.append(pd.DataFrame(res,columns = ColumnNames),ignore_index=True)
    print(df)

if __name__ == '__main__':
    MainTask()

外資系IT企業と日系メーカの違いを思う - Work Rulesを読んで -

日本企業は"意思決定は時間がかかり"、その他の事情と合わせて"生産性は高くない"と言われます。 こういったミクロな状況が積み重なって、「失われた20年」、「生産性が低い"日本"(主語の拡大)」が形成されているのでしょうか。 生産性の高い組織とは、イノベーティブな組織のことでしょうか、意思決定が早い組織のことでしょうか。

そんな中でも、どうすれば組織が生産的になれるかという組織論は昔から私の興味をつかんで放しません。組織論の構成要素の一つに「人事」は欠かすことができないものだと思いますが、生産性の高い企業の例として挙げられるGoogleの人事屋さん、ラズロ・ボック氏の著書を読みました。

ワーク・ルールズ!―君の生き方とリーダーシップを変える

ワーク・ルールズ!―君の生き方とリーダーシップを変える

面白いことに、福利厚生への考え方や昇進・昇給のシステムとしての設計は極めて日系メーカーと重なる部分が多く、このような点からは、日系企業Googleと遜色ない信念を持って人事設計をしていると思います。以下の人事管理入門を片手に本書をひらくと、かなりの部分でGoogleの人事システムと重なるところがあり、「日系企業」感が湧いてくることでしょう。

当たり前すぎてつまらない例ですが、わかりやすいものを挙げると

  • 昇進は○○期連続して好評価を取っている社員を
  • 遺族年金的なシステム
  • 社員教育に力を入れる (学習する組織作り)
  • 給与の"原資"が先立ち、これを分けることで給料・ボーナスが決まる

などです。

マネジメント・テキスト 人事管理入門<第2版>

マネジメント・テキスト 人事管理入門<第2版>

他方で、日系企業では現場の努力として、年下の社員が年上の社員より好成績を上げ続けている状況などで、昇進順序がひっくり返らないように評価を調整するなどシステムでは規定されていないことが起こります。例えば、私の勤める会社では、B以上の評価を2年以上連続してとっていると昇格がある明文化されていない内規があるようなのですが、BとAの評価が続いた後のある期で「こういうものには順番があるのだから今回はCで我慢して」という調整が入った経験があります(その期でB以上を取ると、若くして先輩を追い抜いてしまう)。

こういった点は、政治的な動きも含めて、外資メーカーも日系メーカーも同じことが起こりやすいんだろうなと思います。

年功序列を維持するインセンティブは日系より小さいでしょうが…)

それに対し、ラズロ氏のGoogleでの人事運営は、氏のGEなどでの経験を反面教師に、こういった政治性をいかに排除して透明な人事オペレーションに力を入れるかというところに力点が置かれています。本書では、その要素として

  • 人事もデータで語る(i.e. 日本企業でいえば、年功制を支持するなら年功を支持するデータを客観的に集めて証明する。年功制が効果的なグループとそうでないグループを分けて分析するなど分析を深堀する。)
  • 社内の人事に対する率直な意見交換を促進する (なんでもアンケートを取る)
  • 人事から政治要素を減らすためにマネージャーの権限を調整する(一般的な外資系マネージャーの持つ人事権を減らす→日系管理職に近いレベル)
  • 人事的制度的な実験を恐れない (データがすべて)
  • 権限移譲を促進する - Empowerment (マイクロマネジメントを避ける)

を大事にしながら挑戦した様々な取り組みについて紹介されています。

この中で欠かせないのは「意見交換をする文化」「権限移譲」だと思うのですが、

① 意見交換する文化に関して
労働組合を通さない人事や組織運営に関する意見交換は許さない」という規定や「やり過ごすのが金」という文化とどうやって両立させていくのか
② 権限移譲に関して
日本の企業文化は「見える化」や、細かいスケジュール管理が基盤で、マイクロマネジメントに近い風潮があります。これから離れるのは非常に怖く、不安が伴う

が課題だと思います。結局はトップの意識が変わることが大事なのでしょうか?現場からできることはないのかなぁ。

【参考】日本企業が日本企業文化らしく、うまくいくための要素を研究し、まとめた本

できる社員は「やり過ごす」 (日経ビジネス人文庫)

できる社員は「やり過ごす」 (日経ビジネス人文庫)

「円周率は3.05より大きいことを証明せよ」とアルキメデスな円周率

東大の入試問題と解答例

正月早々Twitterを眺めていると、「2003年の東大入試問題「円周率は3.05より大きいことを証明せよ」のツイートが。 もう14年近く経つのに話題性のある問題ですね。

当時は、ゆとり教育で「円周率を3としよう」みたいな議論が盛り上がっていて、「3だと円に内接する正6角形の周長と変わらないじゃないか。アホじゃないの。」ということが言われていたので、正6角形を正12角形に割って求める…というのは割と直ぐ思いつく解答だったのではないかなと思います。

これだけシンプルな問題だと色々な解法が出てくるようで、正八角形で十分だとか、マクローリン展開を使うだとか色々あるようです。 → 円周率が3.05より大きいことのいろんな証明 | 高校数学の美しい物語

ギリシャ時代のアルキメデスな円周率

さて、イントロが長くなりましたが、実は、この試験、私も受験してまして、ちょうど前日に「円周率πの不思議」という本を読んでいたので不思議な縁を感じながら取り組みました。この本の中には、アルキメデスが、円に内・外接する正96角形を用いて、 3 \frac{10}{71} \lt \pi \lt 3 \frac{1}{7} を示した、という事が書かれており、これを覚えていた当時の私は 3.05 \lt 3 \frac{10}{71} \lt \pi であることから、これを示そうと現場で奮闘したことを覚えています。

結局、当時は、 3 \frac{10}{71} という小学生でも見たことのあるようなシンプルな分数を導出するに至らず、時間の関係から正12角形の周長で諦めたのですが、 3 \frac{10}{71}(=3.1408...)  3 \frac{1}{7} (=3.142..) は一体どうやって求めたのでしょう。

残念ながら、先述の「円周率πの不思議」には書かれておらず、14年ぶりに調べることにしました。

アルキメデスの漸化式

円に内接・外接する正n角形の周長をそれぞれ a_n, b_nとすると、同じ円に内接・外接する正2n角形に周長 a_{2n}, b_{2n}について下記の関係式


a_{2n}=\frac{2 a_n b_n}{a_n + b_n} \\
b_{2n}=\sqrt{a_n b_n}

アルキメデスの漸化式と呼ぶそうです。⇒ Archimedes' Recurrence Formula -- from Wolfram MathWorld

アルキメデスも、これを使って円周率を求めたのでしょうか。なんか正12角形の周長計算と同じじゃね?

一応ちょっとした証明のため、ちょっと補題

f:id:Chachay:20170101212139p:plain

アルキメデスの漸化式の証明には、ちょっと三角関数的な考え方が関わってきます。関わってきますけど、時代の雰囲気を感じるため幾何学計算で覆い隠しました(中身は殆どタンジェントの半角公式です)。

一般に図のような三角形を考えると、△AEOと△HBCが相似の関係にあることから、 EA:OA=BH:CHが成り立ち、また、△BOHと△DOAが相似の関係にあるので、DA:BH=OA:OHです。

これから、 EA(=p_{n+1})= \frac{BH \cdot OA }{CH} = \frac{q_n \cdot OA}{CH}、また、 OH = \frac{BH \cdot OA }{DA} = \frac{q_n \cdot OA}{p_n}。ここで CH = AC - AH = 2OA - AH = OA  + OHを使って、 p_{n+1}= \frac{q_n \cdot OA}{CH} = \frac{q_n \cdot OA}{OA + OH}=  \frac{q_n \cdot OA}{OA +  \frac{q_n \cdot OA}{p_n}}=\frac{q_n \cdot p_n}{p_n + q_n}

次に、△AEOと△GFOの相似関係などを用いて同様に q_{n+1}^2 = p_{n+1}q_n

これを正n角形倍すると先ほどの近似式になりますね。

計算する

当初の嫌な予感通り、分数を引き出すには多少の工夫が必要そうです。

計算詳細:Archimedes Algorithm -- from Wolfram MathWorld

単位円に対する正六角形:


a_6 = 2 \sqrt{3} \\
b_6 = 3

漸化式で同じく正12角形


a_{12} = 12 (2 - \sqrt{3}) \\
b_{12} = 3 (\sqrt{6} - \sqrt{2})

これ、正96角形までやるの…?

ルートで計算を進めている時点で何か違う気が。というのも、アルキメデスの時代には、有理数つまり分数を使った表現以外は使われておらず、平方根に関する計算も不等式と有理数であらわされたといいます。

ちょっと工夫が必要そうだなぁ、と調べると、この"考古学"に既に取り組まれている方のブログに行き当たりました。

tsujimotter.hatenablog.com

分数の分母の選び方は結構、美感によって決まっていそうです。なんだか負けた気分で、今日は、ここまで…。

平方根有理数近似を投げつけて終わります。


\pi \gt b_{12} = 3 (\sqrt{6} - \sqrt{2}) = 3 \sqrt{2}(\sqrt{3} - 1) \gt 3 \frac{41}{29}(\frac{265}{153}-1) = 3 \frac{4592}{4437}=3.1.. \gt 3.05

有理数の出所:

参考文献

円周率πの不思議―アルキメデスからコンピュータまで (ブルーバックス)

円周率πの不思議―アルキメデスからコンピュータまで (ブルーバックス)