파이썬에서 set과 list의 속도차이를 알고 싶어 진행한 실험이다.

테스트환경은

CPU : 3900X

RAM : 128GB

이며

간단한 테스트를 위해 python idle환경에서 테스트하였다.

 

코드는 list와 set에 10억번의 랜덤값을 집어넣은 후

max, min, in을 각각 실행하여 실행시간을 측정하는 방법이다.

코드는 다음과 같다.

대표적으로 iteration을 이용하는 max와 min함수의 실행시간을 측정하였고

탐색함수 in의 실행시간을 측정하였다.

 

결과는 다음과 같다.

결과는 위를 보면 알 수 있듯이

iteration의 경우 list가 14~16초로 압도적으로 빨랐다.

set의 경우 233초로 매우 긴 시간이 걸림을 확인할 수 있다.

 

하지만

in 함수의 경우

list는 8초

set은 0초(!!)라는 엄청난 시간차이를 보여준다.

 

결론

in함수를 많이 사용하는 코드는 set으로

iteration을 많이 사용하는 코드는 list로 짜자.

 

여담

랜덤한 실수 10억개는

메모리를 100기가나 잡아먹는다....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime
import pandas as pd
 
#create app and db
app = Flask(__name__)
app.config['SECRET_KEY'= 'dlfldhsjfk'
print(os.path.join(os.path.abspath(os.path.dirname(__file__)), "practice.db"))
app.config["SQLALCHEMY_DATABASE_URI"= "postgresql://postgres:password@localhost:5432"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'= False
db = SQLAlchemy(app)
 
class Users(db.Model):
    __table_name__ = "users"
 
    pk = db.Column(db.BigInteger, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(100), nullable=False)
 
    def __init__(self, username, email, password, **kwargs):
        self.username = username
        self.email = email
        self.password = generate_password_hash(password)
 
    def check_password(self, password):
        return check_password_hash(self.password, password)
 
    def __repr__(self):
        return f"<User('{self.pk}', '{self.username}', '{self.email}')>"
 
@app.route("/")
def hello():
    db.create_all()
    return "db init finish!"
 
@app.route("/<name>-<email>-<password>")
def set_person(name, email, password):
    user = Users(username=name, email=email, password=password)
    db.session.add(user)
    db.session.commit()
    pd.read_sql("select * from users", db)
    print(pd.head())
    return f"User : {name}, {email}, {password} is added"
 
app.run()
 
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(n, results):
    win = {x:set() for x in range(1, n+1)}
    lose = {x:set() for x in range(1, n+1)}
    for winner, loser in results:
        win[winner].add(loser)
        lose[loser].add(winner)
    for i in range(1, n+1):
        for winner in lose[i]:
            win[winner].update(win[i])
        for loser in win[i]:
            lose[loser].update(lose[i])
    
    answer = 0
    for i in range(1, n+1):
        if len(win[i]) + len(lose[i]) == n-1:
            answer += 1
    return answer
cs

이거 이상으로 좋은 알고리즘이 안떠오른다.....

+ Recent posts