Skip to content

Commit 80a65a9

Browse files
committed
Using sessions in requests to optimize performace
1 parent 7895cae commit 80a65a9

File tree

4 files changed

+44
-21
lines changed

4 files changed

+44
-21
lines changed

codeforces_api/api_requests.py

+24-16
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,21 @@ class CodeforcesApi(CodeforcesApiRequestMaker):
1111
Class for using official API requests.
1212
"""
1313

14+
session = None
15+
16+
def __init__(self):
17+
"""
18+
Initializing class. All we will need is session to optimize performance.
19+
"""
20+
self.session = requests.Session()
21+
1422
def blog_entry_comments(self, blog_entry_id):
1523
"""
1624
Get blogEntry.commnets for blog , blog_entry_id required.
1725
1826
Returns parsed response from codeforces.com.
1927
"""
20-
request = requests.get(
28+
request = self.session.get(
2129
self.generate_url(
2230
"blogEntry.comments", **{"blogEntryId": str(blog_entry_id)}
2331
)
@@ -33,7 +41,7 @@ def blog_entry_view(self, blog_entry_id):
3341
request_url = self.generate_url(
3442
"blogEntry.view", **{"blogEntryId": str(blog_entry_id)}
3543
)
36-
request = requests.get(request_url)
44+
request = self.session.get(request_url)
3745
return self.get_response(request)
3846

3947
def contest_hacks(self, contest_id):
@@ -45,7 +53,7 @@ def contest_hacks(self, contest_id):
4553
request_url = self.generate_url(
4654
"contest.hacks", **{"contestId": str(contest_id)}
4755
)
48-
request = requests.get(request_url)
56+
request = self.session.get(request_url)
4957
return self.get_response(request)
5058

5159
def contest_list(self, gym=False):
@@ -55,7 +63,7 @@ def contest_list(self, gym=False):
5563
Returns parsed response from codeforces.com
5664
"""
5765
request_url = self.generate_url("contest.list", **{"gym": str(gym)})
58-
request = requests.get(request_url)
66+
request = self.session.get(request_url)
5967
return self.get_response(request)
6068

6169
def contest_rating_changes(self, contest_id):
@@ -67,7 +75,7 @@ def contest_rating_changes(self, contest_id):
6775
request_url = self.generate_url(
6876
"contest.ratingChanges", **{"contestId": str(contest_id)}
6977
)
70-
request = requests.get(request_url)
78+
request = self.session.get(request_url)
7179
return self.get_response(request)
7280

7381
def contest_standings(
@@ -113,7 +121,7 @@ def contest_standings(
113121
if room != -1:
114122
parameters["room"] = str(room)
115123
request_url = self.generate_url("contest.standings", **parameters)
116-
request = requests.get(request_url)
124+
request = self.session.get(request_url)
117125
return self.get_response(request)
118126

119127
def contest_status(self, contest_id, handle="", start=-1, count=-1):
@@ -138,7 +146,7 @@ def contest_status(self, contest_id, handle="", start=-1, count=-1):
138146
if count != -1:
139147
parameters["count"] = str(count)
140148
request_url = self.generate_url("contest.status", **parameters)
141-
request = requests.get(request_url)
149+
request = self.session.get(request_url)
142150
return self.get_response(request)
143151

144152
def problemset_problems(self, tags=[""], problemset_name=""):
@@ -161,7 +169,7 @@ def problemset_problems(self, tags=[""], problemset_name=""):
161169
if problemset_name != "":
162170
parameters["problemsetName"] = problemset_name
163171
request_url = self.generate_url("problemset.problems", **parameters)
164-
request = requests.get(request_url)
172+
request = self.session.get(request_url)
165173
return self.get_response(request)
166174

167175
def problemset_recent_status(self, count, problemset_name=""):
@@ -184,7 +192,7 @@ def problemset_recent_status(self, count, problemset_name=""):
184192
if problemset_name != "":
185193
parameters["problemsetName"] = problemset_name
186194
request_url = self.generate_url("problemset.recentStatus", **parameters)
187-
request = requests.get(request_url)
195+
request = self.session.get(request_url)
188196
return self.get_response(request)
189197

190198
def recent_actions(self, max_count=100):
@@ -200,7 +208,7 @@ def recent_actions(self, max_count=100):
200208
if max_count > 100:
201209
raise OverflowError("Max_count should be less or equal to 1000")
202210
request_url = self.generate_url("recentActions", **{"maxCount": str(max_count)})
203-
request = requests.get(request_url)
211+
request = self.session.get(request_url)
204212
return self.get_response(request)
205213

206214
def user_blog_entries(self, handle):
@@ -214,7 +222,7 @@ def user_blog_entries(self, handle):
214222
if handle == "":
215223
raise TypeError("Handle should not be empty")
216224
request_url = self.generate_url("user.blogEntries", **{"handle": str(handle)})
217-
request = requests.get(request_url)
225+
request = self.session.get(request_url)
218226
return self.get_response(request)
219227

220228
def user_friends(self, only_online=False):
@@ -232,7 +240,7 @@ def user_friends(self, only_online=False):
232240
request_url = self.generate_url(
233241
"user.friends", **{"onlyOnline": str(only_online)}
234242
)
235-
request = requests.get(request_url)
243+
request = self.session.get(request_url)
236244
return self.get_response(request)
237245

238246
def user_info(self, handles):
@@ -248,7 +256,7 @@ def user_info(self, handles):
248256
if len(handles) > 10000:
249257
raise OverflowError("Max count of handles should be less or equal to 10000")
250258
request_url = self.generate_url("user.info", **{"handles": handles})
251-
request = requests.get(request_url)
259+
request = self.session.get(request_url)
252260
return self.get_response(request)
253261

254262
def user_rated_list(self, active_only=False):
@@ -262,7 +270,7 @@ def user_rated_list(self, active_only=False):
262270
request_url = self.generate_url(
263271
"user.ratedList", **{"activeOnly": str(active_only)}
264272
)
265-
request = requests.get(request_url)
273+
request = self.session.get(request_url)
266274
return self.get_response(request)
267275

268276
def user_rating(self, handle):
@@ -274,7 +282,7 @@ def user_rating(self, handle):
274282
Returns parsed response from codeforces.com.
275283
"""
276284
request_url = self.generate_url("user.rating", **{"handle": str(handle)})
277-
request = requests.get(request_url)
285+
request = self.session.get(request_url)
278286
return self.get_response(request)
279287

280288
def user_status(self, handle, start=-1, count=-1):
@@ -297,5 +305,5 @@ def user_status(self, handle, start=-1, count=-1):
297305
if count != -1:
298306
parameters["count"] = str(count)
299307
request_url = self.generate_url("user.status", **parameters)
300-
request = requests.get(request_url)
308+
request = self.session.get(request_url)
301309
return self.get_response(request)

codeforces_api/parse_methods.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@
66

77

88
class CodeforcesParser:
9+
10+
session = None
11+
12+
def __init__(self):
13+
"""
14+
Initializing class. All we will need is session to optimize performance.
15+
"""
16+
self.session = requests.Session()
17+
918
def get_solution(self, contest_id, submit_id):
1019
"""
1120
Returns source code for specified submit.
@@ -14,16 +23,16 @@ def get_solution(self, contest_id, submit_id):
1423
1524
submit_id is the id of sumbission.
1625
"""
17-
solutionPage = requests.get(
26+
solutionPage = self.session.get(
1827
"https://codeforces.com/contest/"
1928
+ str(contest_id)
2029
+ "/submission/"
2130
+ str(submit_id)
2231
)
2332
if int(solutionPage.status_code) != 200:
24-
raise Exception("Returned not OK code" + str(solutionPage))
33+
raise Exception("Returned not OK code " + str(solutionPage))
2534
tree2 = html.fromstring(solutionPage.text)
26-
code = tree2.xpath('//*[@id="pageContent"]/div[3]/pre/text()')
35+
code = tree2.xpath("//pre[@id='program-source-text']/text()")
2736
if len(code) == 0:
28-
raise ValueError("Incorrect contest_id or submit_id" + str(code))
37+
raise ValueError("Incorrect contest_id or submit_id " + str(code))
2938
return code[0].replace("\r", "")

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setup(
77
name="CodeforcesApiPy",
8-
version="1.3.3",
8+
version="1.4.0",
99
description="Implementation of codeforces.com API",
1010
platforms="any",
1111
url="https://github.com/VadVergasov/CodeforcesApiPy",

tests/main.py

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import codeforces_api
66
import conf
7+
import time
78

89
MAIN = codeforces_api.CodeforcesApi(conf.API_KEY, conf.API_SECRET)
910

@@ -14,16 +15,21 @@
1415
HACKS = MAIN.contest_hacks(1311)
1516
LIST = MAIN.contest_list()
1617
RATING_CHANGES = MAIN.contest_rating_changes(1311)
18+
time.sleep(1)
1719
STANDINGS = MAIN.contest_standings(1311, handles=["tourist", "VadVergasov"])
1820
STATUS = MAIN.contest_status(1311)
1921
PROBLEMS = MAIN.problemset_problems()
2022
RECENT_STATUS = MAIN.problemset_recent_status(10)
2123
RECENT_ACTIONS = MAIN.recent_actions()
24+
time.sleep(1)
2225
USER_ENTRIES = MAIN.user_blog_entries("VadVergasov")
2326
FRIENDS = MAIN.user_friends(True)
2427
INFO = MAIN.user_info(["tourist", "VadVergasov"])
2528
RATINGS = MAIN.user_rated_list(True)
2629
USER_RATING = MAIN.user_rating("VadVergasov")
30+
time.sleep(1)
2731
USER_STATUS = MAIN.user_status("VadVergasov")
2832

2933
SOLUTION = PARSER.get_solution(1322, 72628149)
34+
35+
print("No errors found!")

0 commit comments

Comments
 (0)