文字列を分割して数値を効率よく取得するには

Pythonで文字列を分割して数値を効率よく取得したい。

たとえば、

s = "10 20 30"

という文字列sから、変数aに10、変数bに20を設定したい。

処理時間の計測には、「Pythonで処理の時間を計測する冴えた方法」の@stop_watchデコレータを使用した。

方法1

x = s.split()
a = int(x[0])
b = int(x[1])

シンプルだが冗長に思える。

>>> @stop_watch
... def func1():
...     s = "10 20 30"
...     for i in range(999999):
...         x = s.split()
...         a = int(x[0])
...         b = int(x[1])
func1は0.6499965190887451秒かかりました

方法2

a, b, _ = map(int, s.split())

方法1より簡潔だが、実行速度は約1.5倍遅かった。
不要な3番目の値にもint()を行っているからだろうか。

>>> @stop_watch
... def func2():
...     s = "10 20 30"
...     for i in range(999999):
...         a, b, _ = map(int, s.split())
...
>>> func2()
func2は0.9099972248077393秒かかりました

方法3

a, b = map(int, s.split()[0:2])

3番目の値は不要なので、int()を適用しないようにしてみた。
若干早くなったが、方法1には及ばす。

>>> @stop_watch
... def func3():
...     s = "10 20 30"
...     for i in range(999999):
...         a, b = map(int, s.split()[0:2])
...
>>> func3()
func3は0.8530454635620117秒かかりました

Windows10にプリインストールされているアプリを削除する

Windows 10には、はじめからフォトアプリがインストールされている。
このフォトアプリが起動していなくても大量のメモリを使用していた。

フォトアプリの削除方法を調べていると、PowerShellを管理者権限で起動して次のコマンドを実行すると削除できることがわかった。
プリインストールされている未使用のアプリをまとめて削除した。

削除コマンドと、削除したアプリの再インストール方法はこちら↓

PowerShellを管理者権限で起動して、次のコマンドを実行する。

フォトアプリを削除

> get-appxpackage *Microsoft.Windows.Photos* | remove-appxpackage

映画& テレビを削除

> get-appxpackage *Microsoft.ZuneVideo* | remove-appxpackage

Xboxアプリを削除

> get-appxpackage *Microsoft.XboxApp* | remove-appxpackage

Grooveミュージックアプリを削除

> get-appxpackage *Microsoft.ZuneMusic* | remove-appxpackage

Peopleアプリを削除

> get-appxpackage *Microsoft.People* | remove-appxpackage

参考

Pythonで列挙型(enum)を使う

Python バージョン3.4から列挙型(enum)がサポートされました。

列挙型(enum)の使い方を確認します。

列挙型(Enum)の作成

class文を使った作成方法

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3
...
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1

Enumの値の設定方法

enumの値は数値である必要はありません。
文字列を使用するサンプルです。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     GREEN = "緑"
...
>>> Color.RED
<Color.RED: '赤'>
>>> Color.RED.value
'赤'

autoを使って、値を自動的に設定できます。

>>> from enum import Enum, auto
>>> class Color(Enum):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

ドキュメントによると、「すべての列挙型メンバーの評価は True でなければならない」とのこと。
 None,False,0,”などは値に使えない?

機能APIを使った作成方法

Enum()の第1引数は列挙型の名前、第2引数は空白区切りの列挙型のメンバーの名前です。

>>> from enum import Enum
>>> Color = Enum("Color", "RED BLUE GREEN")
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1

第2引数の区切り文字は空白の他にカンマも使用できます。

>>> Color = Enum("Color", "RED, BLUE, GREEN")
>>> Color.RED
<Color.RED: 1>

第2引数には、イテレータで指定することもできます。

>>> from enum import Enum
>>> Color = Enum("Color", ["RED", "BLUE", "GREEN"])
>>> Color.RED
<Color.RED: 1>

名前と値のペアのイテレータで指定することもできます。

>>> from enum import Enum
>>> Color = Enum("Color", [("RED", 2), ("BLUE", 3), ("GREEN", 4)])
>>> Color.RED
<Color.RED: 2>

イテレータの他に、マッピングでも指定できます。

>>> from enum import Enum
>>> Color = Enum("Color", {"RED": 2, "BLUE": 3, "GREEN": 4})
>>> Color.RED
<Color.RED: 2>

列挙型(Enum)のメンバー

列挙型(Enum)は名前(name)と値(value)を持ちます。

>>> from enum import Enum
>>> Color = Enum("Color", "RED BLUE GREEN")
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1

列挙型(Enum)は同じ名前のメンバーを複数持つことはできません。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     RED = 2
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in Color

同じ値を持つメンバーを複数持つことはできます。
このとき、後に定義された方は先に定義された方の別名になります。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     BLUE = 1
...
>>> Color.RED
<Color.RED: 1>
>>> Color.BLUE
<Color.RED: 1>

uniqueデコレーターを使うと、同じ値を持つメンバーが存在するとき、エラーにできます。

>>> from enum import Enum, unique
>>> @unique
... class Color(Enum):
...     RED = 1
...     BLUE = 1
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ValueError: duplicate values found in <enum 'Color'>: BLUE -> RED

比較

列挙型(Enum)は、==、!=、is、is notで同じかどうかを比較できます。

>>> from enum import Enum
>>> Color = Enum("Color", "RED BLUE GREEN")
>>> Color.RED == Color.BLUE
False
>>> Color.RED != Color.BLUE
True
>>> Color.RED is Color.BLUE
False
>>> Color.RED is not Color.BLUE
True

イテレーション

列挙型(enum)はイテレーションをサポートします。
順序は定義順になります。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     GREEN = "緑"
...
>>> print(list(Color))
[<Color.RED: '赤'>, <Color.BLUE: '青'>, <Color.GREEN: '緑'>]
>>> for c in Color:
...     print(c)
...
Color.RED
Color.BLUE
Color.GREEN

列挙型(Enum)の取得

名前から列挙型(Enum)のメンバーを取得する

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     GREEN = "緑"
...
>>> Color["RED"]
<Color.RED: '赤'>
>>> Color["BLUE"]
<Color.BLUE: '青'>

値から列挙型(Enum)のメンバーを取得する

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     GREEN = "緑"
...
>>> Color("赤")
<Color.RED: '赤'>
>>> Color("青")
<Color.BLUE: '青'>
>>> Color("赤")

列挙型(Enum)にメソッドを追加する

列挙型(Enum)はクラスなので、通常のクラスと同じように、メソッドを持たせることができます。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     def to_html(self):
...             if self is self.RED: return "#FF0000"
...             if self is self.BLUE: return "#0000FF"
...
>>> Color.RED.to_html()
'#FF0000'

PowerShellでAnacondaを使う方法

AnacondaをPowerShellで使えるようにするための設定方法の備忘録。

PowerShellのパスを登録する

PowerShellから次のコマンドを実行する。

> $profile
C:\Users\yamamoto\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

起動時に読み込まれるスクリプトのパスが表示される。

表示されたフォルダーを作成する。

notepad $profile

メモ帳が起動したら、Anacondaのディレクトリをパスに追加する。

# Anaconda
$Env:Path += ";C:\Users\yamamoto\Anaconda3\Library\bin\"
$Env:Path += ";C:\Users\yamamoto\Anaconda3\Scripts"

PowerShellの権限を設定する

PowerShellを起動すると、「このシステムではスクリプトの実行が無効になっているため、…」というエラーメッセージが表示される。

詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。

このURLを開くと、現在の実行ポリシーはスクリプトを実行できない設定になっているためエラーになっていることがわかる。

現在の設定は「Get-ExecutionPolicy」コマンドで確認できる。

> Get-ExecutionPolicy
Restricted

「Restricted」は既定のポリシーで、スクリプトは実行できない。

実行ポリシーを変更する

実行ポリシーを「RemoteSigned」に変更する。

「RemoteSigned」は、
ローカルコンピューター上で記述されたスクリプト
インターネットからダウンロードされた信頼された発行元によってデジタル署名されているスクリプト
を実行できる。

PowerShellを管理者として実行し、次のコマンドを実行する。

> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

これで、スクリプトを実行できるようになった。

condaコマンドを実行してみる。

PowerShellを起動する。
エラーメッセージは表示されなくなっている。

以下のコマンドを実行する。

> conda -V
conda 4.5.4

バージョンが表示されれば成功だ。

activateできない問題を解決する

PowerShellからactivateコマンドを実行しても、仮想環境を使用できない。

次のコマンドを実行すると、PowerShellでactivateコマンドが使えるようになる。

> conda install -n root -c pscondaenvs pscondaenvs

動作を確認する。

> activate my_env
(my_env) PS C:\Users\yamamoto> python --version
Python 3.6.5 :: Anaconda, Inc.

使えるようになった。