teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2018/05/03 23:18

投稿

umyu
umyu

スコア5846

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

追記

2018/05/03 23:18

投稿

umyu
umyu

スコア5846

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

そもそも論として、標準入力からファイルを渡せばよい話なので修正!

2018/05/03 23:15

投稿

umyu
umyu

スコア5846

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
- with open("13.txt", "r") as f:
16
+ sort_count = sorted(a.items(), key=lambda x: x[1])
17
- text_str = f.read()
18
17
 
18
+ total = 0
19
- n_k, data = text_str.split("\n")[:2]
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
- #print(total)
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
- ![イメージ説明](c1274af9280b6b9d14eaaf8cb58cb0b7.jpeg)
36
+ ![イメージ説明](812ad02d39ffd2201fee0d97cfbfd489.jpeg)
52
- 実行時間が9.10 sかかり、 そのうち7.14 sが`collection`の`count`が占めているのが分かります。
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`の引数部分`tuple`になっているため、試しに`list`に変更してみます。
42
+ `Counter`の引数がジェネレータ式(※1)になっているため、試しに`input().split()`に変更してみます。
43
+ ※1 hayataka2049さん指摘ありがとうございました。
44
+
58
45
  ※注意
59
46
  ここから変更するソースコードは`after.py`です。
60
47
  ```Python
61
- a = Counter([i for i in data.split()])
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
- ![イメージ説明](f4c526df7730410956059f27442902b3.jpeg)
53
+ ![イメージ説明](3cd713458ddb257a9dc51284a1c462e6.jpeg)
67
- 結果
54
+ 結果
68
- 9.10 sから6.43 sに高速化されました。
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

2018/05/03 22:56

投稿

umyu
umyu

スコア5846

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)