回答編集履歴
4
追記
answer
CHANGED
@@ -62,4 +62,4 @@
|
|
62
62
|
|
63
63
|
> pythonのバージョンは3.6.5を使用しています。
|
64
64
|
|
65
|
-
[すべての提出一覧](https://beta.atcoder.jp/contests/abc081/submissions)を見る限りではAtCoderの実行環境はPython3 (3.4.3)のなためvenvなどで、仮想環境を構築して同じ環境(3.4.3)にしたほうが良いと思われます。
|
65
|
+
[すべての提出一覧](https://beta.atcoder.jp/contests/abc081/submissions?f.Task=arc086_a&f.Language=3023&f.Status=&f.User=)を見る限りではAtCoderの実行環境はPython3 (3.4.3)のなためvenvなどで、仮想環境を構築して同じ環境(3.4.3)にしたほうが良いと思われます。
|
3
追記
answer
CHANGED
@@ -56,4 +56,10 @@
|
|
56
56
|
このような形で一番CPU時間を専有している部分から、最初に求めた**デッドラインの時間を満たすまで**チューニングをします。
|
57
57
|
|
58
58
|
◇参考情報
|
59
|
-
[SNAKEVIZ](https://jiffyclub.github.io/snakeviz/)
|
59
|
+
[SNAKEVIZ](https://jiffyclub.github.io/snakeviz/)
|
60
|
+
|
61
|
+
---
|
62
|
+
|
63
|
+
> pythonのバージョンは3.6.5を使用しています。
|
64
|
+
|
65
|
+
[すべての提出一覧](https://beta.atcoder.jp/contests/abc081/submissions)を見る限りではAtCoderの実行環境はPython3 (3.4.3)のなためvenvなどで、仮想環境を構築して同じ環境(3.4.3)にしたほうが良いと思われます。
|
2
そもそも論として、標準入力からファイルを渡せばよい話なので修正!
answer
CHANGED
@@ -9,65 +9,51 @@
|
|
9
9
|
◇手順
|
10
10
|
1,`before.py`を作成しその後コピーし`after.py`を作成します。
|
11
11
|
```Python
|
12
|
-
# -*- coding: utf-8 -*-
|
13
|
-
from timeit import timeit
|
14
12
|
from collections import Counter
|
13
|
+
n, k = map(int, input().split())
|
14
|
+
a = Counter((i for i in input().split()))
|
15
15
|
|
16
|
-
|
16
|
+
sort_count = sorted(a.items(), key=lambda x: x[1])
|
17
|
-
text_str = f.read()
|
18
17
|
|
18
|
+
total = 0
|
19
|
-
|
19
|
+
while len(sort_count) > k:
|
20
|
+
_, n = sort_count.pop(0)
|
21
|
+
total += n
|
20
22
|
|
21
|
-
|
22
|
-
def main():
|
23
|
-
n, k = map(int, n_k.split())
|
24
|
-
a = Counter((i for i in data.split()))
|
25
|
-
sort_count = sorted(a.items(), key=lambda x: x[1])
|
26
|
-
|
27
|
-
total = 0
|
28
|
-
while len(sort_count) > k:
|
29
|
-
_, n = sort_count.pop(0)
|
30
|
-
total += n
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
print(total)
|
34
|
-
|
35
|
-
|
36
|
-
if __name__ == "__main__":
|
37
|
-
timeit(stmt=main, number=100)
|
38
|
-
|
39
24
|
```
|
40
25
|
変更するのは`after.py`です。
|
41
26
|
|
42
|
-
2,初回のプロファイルを取ります。
|
27
|
+
2,初回のプロファイルを取ります。入力ファイルはリダイレクトで渡します。
|
43
|
-
`python -m cProfile -o before.prof before.py`
|
28
|
+
`python -m cProfile -o before.prof before.py < 13.txt`
|
44
|
-
`python -m cProfile -o after.prof after.py`
|
29
|
+
`python -m cProfile -o after.prof after.py < 13.txt`
|
45
30
|
|
46
31
|
3,`snakeviz`で、プロファイル結果を表示します。
|
47
32
|
`snakeviz before.prof`
|
48
33
|
`snakeviz after.prof`
|
49
34
|
|
50
35
|
4,プロファイル結果を元にボトルネックを特定します。
|
51
|
-

|
52
|
-
実行時間が
|
37
|
+
実行時間が0.0998 sかかり、 そのうち0.0714 sが`collection`の`count`が占めているのが分かります。
|
53
38
|
直前の呼び出し部分が`update`なので、ソースコードの`Counter`をチェックします。
|
54
39
|
```Python
|
55
40
|
a = Counter((i for i in data.split()))
|
56
41
|
```
|
57
|
-
`Counter`の引数
|
42
|
+
`Counter`の引数がジェネレータ式(※1)になっているため、試しに`input().split()`に変更してみます。
|
43
|
+
※1 hayataka2049さん指摘ありがとうございました。
|
44
|
+
|
58
45
|
※注意
|
59
46
|
ここから変更するソースコードは`after.py`です。
|
60
47
|
```Python
|
61
|
-
a = Counter(
|
48
|
+
a = Counter(input().split())
|
62
49
|
```
|
63
50
|
6,`after.py`のプロファイルを再度取ります。
|
64
|
-
`python -m cProfile -o after.prof after.py`
|
51
|
+
`python -m cProfile -o after.prof after.py < 13.txt`
|
65
52
|
`snakeviz after.prof`
|
66
|
-

|
67
|
-
結果
|
54
|
+
◇結果
|
68
|
-
|
55
|
+
0.0714 sから0.0598 sに高速化されました。
|
69
56
|
このような形で一番CPU時間を専有している部分から、最初に求めた**デッドラインの時間を満たすまで**チューニングをします。
|
70
57
|
|
71
58
|
◇参考情報
|
72
|
-
[SNAKEVIZ](https://jiffyclub.github.io/snakeviz/)
|
59
|
+
[SNAKEVIZ](https://jiffyclub.github.io/snakeviz/)
|
73
|
-
[27.5. timeit — 小さなコード断片の実行時間計測](https://docs.python.jp/3/library/timeit.html)
|
1
timeit
answer
CHANGED
@@ -69,4 +69,5 @@
|
|
69
69
|
このような形で一番CPU時間を専有している部分から、最初に求めた**デッドラインの時間を満たすまで**チューニングをします。
|
70
70
|
|
71
71
|
◇参考情報
|
72
|
-
[SNAKEVIZ](https://jiffyclub.github.io/snakeviz/)
|
72
|
+
[SNAKEVIZ](https://jiffyclub.github.io/snakeviz/)
|
73
|
+
[27.5. timeit — 小さなコード断片の実行時間計測](https://docs.python.jp/3/library/timeit.html)
|