めもてふ

Python, Latex, Fortranを取り扱います

E123, E128, E221, E225, E226, E228, E231, E241, E261, E265, E302, E303, E501, F401, W291, W292, W293, W503

Ubuntuの使い勝手について

僕は、研究室では普段Ubuntuを使っています。(たまにWindowsも使います。後述) 研究室の同期から「Ubuntuって使いやすいの?」と聞かれたので勝手に語ります

質問に一言で回答するならば「単に研究をするだけなら使いやすさに差はない」です。 Windowsを使うだけでイライラしたり、余裕があって新しいことに挑戦みたいなのでなければ Windowsでも良いかなーみたいな感じです。

WindowsにできてUbuntuでもできること(Macでもできること)

  • プログラムを書く
  • 実行する (WindowsにはMinGWがあるし、clangを使うのでなければ)
  • LaTeXで論文を書く

WindowsUbuntuではキーボードもマウスも共通のものを使うので、 使うソフトが同じなら使いやすさはあんまり変わらないかなーと思います。
若干UIは違いますが、苦にはならないです。(個人差あり)

WindowsにできてUbuntuにできないこと

  • 就活用のWebテスト (大抵Ubuntuは動作保証対象外)
  • Office系のソフトを使う(PowerPoint信者にはつらい)
    • Libre Office ImpressはあるけどPowerPointっょぃ...
  • VisualStudioを使う(もうすぐMac版は来るようですがUbuntu版は...)
  • Adobe Acrobatを使う(Ubuntu版がない)
    • AcrobatでコメントをつけてもUbuntuユーザーはそれを見られない
  • Unityでゲーム開発(Ubuntuでもできなくはない)
  • 研究室のプリンタが使えない
    • 致命的

UbuntuにできてWindowsにできないこと

  • 綺麗にフォントを表示する
  • 見た目を変える
    • 良いデザインはモチベーションに直結すると思います
  • パスでバックスラッシュを使わなくて良い\
    • なぜWindowsではフォルダの区切りにバックスラッシュを使うのかorz
    • なので既存のオープンソースのソフトを弄るときはUbuntuの方が楽だったりする
  • メモリを喰わない(対 Windows

Atomで斜体を一括で立体にする

Atomでは、テーマによってはコメントが斜体になることがあって気持ち悪い。

日本人はコメントを日本語で書くので(斜体が用意されてない日本語フォントでは、あるいはそもそも日本語が斜体に適していないため)残念になるのだと思う。

そういう時は

.editor, atom-text-editor::shadow { // テキストエディタ中の斜体を一括でやめる
    .comment, .keyword, .storage, .variable, .class {
        font-style: normal !important;
    }
}

これをstyle.lessに書き込むよろし。

スライドの美しさについて

パワーポイントを使うなら,美しいスライドを作るべきだ.

中身が重要で,スタイリッシュさは2の次といえど 目に入れて心地よさを感じなければ,興ざめである.

この記事はまた後で ちゃんと書く予定

数値計算向けpythonの高速化について

Pythonの高速化について

前半では,既に手元に動くコードが有るとして,そのコードの高速化を行う方法を紹介する. 後半では、主にnumba.jitの使い方を説明することになるので AnacondaからPythonを入れておくのが望ましい.

数値計算中のPythonの実行速度が低い原因

数値計算において,Pythonが遅くなる原因は

大きなfor文の中で条件分岐、ランダム値の発生、配列操作を何回も行う

である.しかし,大きなfor文は数値計算する上でどうしても必要なので(特に微分方程式の人) for文の規模はそのままで、高速化する方法について説明することにする.

配列内操作を早くする工夫はnumba.jitを使うのが最も良いであろう。 使い方の詳細は後半で取り上げるが,簡単な例は次節でも説明するので参照されたい.

for文の中の条件分岐・ランダム値の発生に伴う速度低下に対する工夫

このようなfor文の中の条件分岐,ランダム値の発生に対する工夫は2つある.

  1. とりあえずnumba.jitを使う
    • numba.jit とは直下の関数を予めコンパイルする機能.
    • 詳しい使い方は後述する.
  2. 必要そうなら条件分岐を外に出す

これらの工夫を行う例を次に示す.

from numba import jit 
import numpy as np

# iが7の倍数でなく かつ iが5の倍数でない (0 <= i < n)
# jが11の倍数でなく かつ jが6の倍数でない (0 <= j < n) 時に
# i-2*jを足し上げて行く関数

def f1_1(n): # とりあえず組んでみた.遅い
    k = 0
    for i in range(n):
        if i%7 != 0 and i%5 != 0:
            for j in range(n):
                if j%11 != 0 and j%6!= 0:
                    k += i - 2. * j
    return k

@jit
def f1_2(n): # jitをつけてみた.結構早くなった
    k = 0
    for i in range(n):
        if i%7 != 0 and i%5 != 0:
            for j in range(n):
                if j%11 != 0 and j%6!= 0:
                    k += i - 2. * j
    return k

def f1_3(n): # 条件分岐を外に出してみた.もっと早くなった
    k = 0.   # ただしリスト内包表記は@jitの中で使えないみたいなので
             # このように外側に出している.
             # 今回はi_listもj_listも長さが1万以下なので使った.
             # i_listの長さが500万を超えるとちょっとメモリ的にきついイメージがある.
    i_list = np.array([i for i in range(n) if (i%7!=0 and i%5!=0)])
    j_list = np.array([j for j in range(n) if (j%11!=0 and j%6!=0)])
    @jit
    def loop(k):
        for i in i_list:
            for j in j_list:
                k += i - 2. * j
        return k
    return loop(k)
%time print(f1_1(10000))
%time print(f1_2(10000))
%time print(f1_3(10000))

実行結果

-259662261645.0
Wall time: 20.2 s
-259662261645.0
Wall time: 328 ms
-259662261645.0
Wall time: 137 ms
# for文を使う中でどうするかという話をしてるので
# 「次の関数のようにfor文をなくすようにプログラミングせよ」というのは今回はお門違いである.
# (一応一番早そうなのを載せておく)
def f1_5(n):
    k = 0. 
    i_list = np.array([i for i in range(n) if (i%7!=0 and i%5!=0)], dtype=float)
    j_list = np.array([j for j in range(n) if (j%11!=0 and j%6!=0)], dtype=float)
    k= np.sum(i_list)*len(j_list) - 2.* np.sum(j_list)*len(i_list)
    return k
%time print(f1_5(10000))

実行結果

-259662261645.0
Wall time: 9.01 ms

この現象と同様に,for文の中で,1回1回ランダムな値を発生させるのも(jitを使わない時は)遅くなる原因である.

from numba import jit 
import numpy as np

# iが7の倍数でなく かつ iが5の倍数でない (0 <= i < n)
# jが11の倍数でなく かつ jが6の倍数でない (0 <= j < n) 時に
# i-2*j+rを足し上げて行く関数.rはランダムな値

def f2_1(n): # とりあえず組んでみた.遅い
    k = 0
    for i in range(n):
        if i%7 != 0 and i%5 != 0:
            for j in range(n):
                if j%11 != 0 and j%6!= 0:
                    k += i - 2. * j * np.random.rand()
    return k

@jit
def f2_2(n): # jitをつけてみた.結構早くなった
    k = 0
    for i in range(n):
        if i%7 != 0 and i%5 != 0:
            for j in range(n):
                if j%11 != 0 and j%6!= 0:
                    k += i - 2. * j * np.random.rand()
    return k

def f2_3(n):
    k = 0.   
    i_list = np.array([i for i in range(n) if (i%7!=0 and i%5!=0)])
    j_list = np.array([j for j in range(n) if (j%11!=0 and j%6!=0)])
    @jit
    def loop(k):
        j_length = len(j_list)
        for i in i_list: # j のループの前にランダムなベクトルを作成しておく
            r_list = np.random.sample((j_length,))
            for j in j_list:
                k += i - 2. * j * r_list[j]
        return k
    return loop(k)

%time print(f2_1(10000))
%time print(f2_2(10000))
%time print(f2_3(10000))

実行結果

15782474.565609181
Wall time: 26.9 s
51387550.184736826
Wall time: 609 ms
nan
Wall time: 558 ms

ATOMのatomic-chrome

ATOMatomic-chromeという拡張機能について

何をする拡張機能

google chromeATOMが連携して,リアルタイムで同時に文字を打つことができる拡張機能です.

下の画像がその使用例です.

f:id:kg15m:20160903015657p:plain

何に使えるか

ぱっと思いつくのは次の2つです

  • ブログの編集(Markdown
  • Jupyter notebookのプログラムを打つ

ATOMを立ち上げたまま,Jupyterでコードを書いて回すことがしょっちゅうあるので
個人的にはこの機能は結構美味しいです.

※ Jupyter notebooke =
 (エディタ+コマンドプロンプト+メモ帳+powerpoint)/1.5
のようなソフトです.より詳しい説明はググってください.

日本語用のテンプレート(Lualatexでフル装備)

重た目のレポート書いたりとか論文の下書き用

Index.tex

\documentclass[12pt,a4]{ltjsarticle}
\usepackage{MyStyle}
\usepackage{MyCommands}
\title{タイトル}
\author{名前}
\date{\mytoday}
\begin{document}
    \maketitle
    % 内容
\end{document}

MyStyle.sty

% 論文を書くのに必要なパッケージ
\usepackage{empheq} % (AMS)の上位互換.綺麗に連立一次方程式とか書ける
\usepackage{amssymb} % 数式用のフォントを含む
%\usepackage{amsfonts} % pxフォントを使うので使用しない
\usepackage{bm} % ベクトルを表示する
\usepackage{mathtools} % 式番号のコントロールができる
\mathtoolsset{showonlyrefs=true} % 引用されない式番号は載せない

\usepackage{graphicx} % 画像の挿入、回転、拡大・縮小ができる
\usepackage[hang,small,bf]{caption} % 図、表を縦横に並べられる
\usepackage[subrefformat=parens]{subcaption}

\usepackage{pgfplots} % texでグラフを書けるパッケージ
                      % pgfplotsを読みこめばtikZも一緒に読み込まれる
\usepackage{booktabs} % 表のセルの結合とか綺麗に罫線引いたりに使う
\usepackage{pgfplotstable}
\pgfplotsset{filter discard warning=false}

\usepackage{hyperref} % pdf中にリンクの埋め込みをしてくれる
\usepackage{listings} % TeX文章中でコードを埋め込める
\usepackage{verbatim} % テキストを直接出力する環境の定義パッケージ

\usepackage{algorithm}
\usepackage[noend]{algpseudocode} % アルゴリズムを表示できる
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
\newcommand{\stt}{\State}
\newcommand{\In}{\Require}
\newcommand{\Out}{\Ensure}

\usepackage{physics} % 物理系の人におすすめ
\usepackage[hmargin=1.8cm, vmargin=1.8cm]{geometry} % 余白の設定
%\usepackage{setspace} %   行間を設定するパッケージ
%\setstretch{1.3} % 行間


% 日本語の論文では必要だと思われる設定
\usepackage{newpxmath}
\usepackage{luatexja}
\usepackage{luatexja-fontspec}
\setmainfont[BoldFont=IPAexGothic]{IPAexMincho}
\setsansfont{IPAexGothic}
\setmainjfont[BoldFont=YuGothB]{yumin}
\setsansjfont[BoldFont=YuGothB]{YuGothM}



% 日本語で「定理」とか「証明」とか書きたい
\let\openbox\relax
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{theorem}{定理}[section]
\newtheorem{definition}{定義}[section]

MyCommands.stayle

% 日付を書き込むためだけのコマンド
    \newcommand{\mytoday}{%
        \the\year/{\ifnum \month < 10 0\the\month \else \the\month \fi}/%
        {\ifnum \day < 10 0\the\day \else \the\day \fi}}

% 集合
    \newcommand{\bN}{\mathbb{N}}
    \newcommand{\bZ}{\mathbb{Z}}
    \newcommand{\bbN}{\in \mathbb{N}}
    \newcommand{\bbZ}{\in \mathbb{Z}}