문자열을 사용하여 파이썬에서 나만의 목록 유형을 구축한 방법

13149 단어 pythonfunprogramming
문자열 유형을 사용하여 Python에서 목록 유형을 작성한다는 생각이 들었습니다. 바보 같죠? “미친 생각; 내 옛 동료 중 한 명이 말하곤했던 나쁜 피치”. 나는 그것이 어리석다는 것을 알고 있었고 그것이 요점이었습니다! 이 아이디어는 몇 년 전 연결 목록을 구현하면서 떠오른 것입니다. "어떤 다른 방법으로 목록을 나타낼 수 있습니까?"나는 생각했다. "문자열을 사용하여 목록 유형을 만들겠습니다!"

파이썬 🐍 선택하기



파이썬은 재미있다! 빠르게 시작할 수 있고 대규모 커뮤니티가 있으며 도움이 되는 성숙한 도구가 있습니다. JavaScript를 선택할 수도 있었지만 Python에 대한 경험이 적고 그것에 대해 더 배우고 싶었습니다.

목록 유형 디자인



이것은 대부분의 두뇌 능력이 사용되는 부분입니다 – 일반적으로. 나를 위해 그것은 빨랐다. 문자열 목록에 내 목록 유형을 다음과 같이 디자인하기로 결정했습니다.

element1,element2,element3


주로 가독성을 위해 요소 사이의 구분 기호로 ","를 선택했습니다.

(유형이 지정되지 않은) Python과 마찬가지로 내 목록은 이기종일 것입니다. 즉, 동일한 목록에 다른 유형의 요소를 저장할 수 있습니다. 네이티브 목록 유형에 맞추고 구현을 단순화하기 위해 이 결정을 내렸습니다.

API 디자인 나열 📄



다음 단계는 새 목록 유형에 대한 API를 결정하는 것이었습니다. API for Python의 목록을 보고 대부분 구현하기로 했습니다. copy()reverse()와 같은 일부는 제외하기로 선택했습니다.

구현 😌



이것은 재미있는 부분이었습니다! 새 목록을 초기화하는 것은 쉬웠습니다. 빈 문자열을 만들면 됩니다. add() 와 동일합니다. 중간에 구분 기호를 사용하여 끝에 추가하면 됩니다.

__list: str = ""
__delimiter: str = ","

def add(self, element: object) -> None:
    if self.is_empty():
        self.__list = element
    else:
        self.__list += "{}{}".format(self.__delimiter, element)


약간 더 복잡한 remove()에 대한 지원도 추가했습니다.

def remove(self, element: object) -> bool:
    for i in range(self.size()):
       if self.get(i) == element:
           self.remove_at(i)
           return True

   return False


결국 12개의 메서드를 구현했지만 이 게시물을 더 이상 코드로 어지럽히고 싶지 않습니다. 저장소에 대한 링크는 아래를 참조하십시오.

성능 🚀



목록 유형을 구현한 후에는 기본 목록 유형과 비교하여 성능이 어떤지 매우 궁금했습니다. 모든 새로운 방법을 벤치마킹하기로 결정했으며 결과는 다음과 같습니다.

List        Function            Description                                     N       Result
----------------------------------------------------------------------------------------------------------
Native      constructor         new instance with 100 strings                   10000   7.07ms
SlowList    constructor         new instance with 100 strings                   10000   1926.76ms
----------------------------------------------------------------------------------------------------------
Native      constructor         new instance with 100 ints                      10000   5.95ms
SlowList    constructor         new instance with 100 ints                      10000   1499.77ms
----------------------------------------------------------------------------------------------------------
Native      constructor         new instance using of() with 100 strings        10000   6.40ms
SlowList    constructor         new instance using of() with 100 strings        10000   1868.80ms
----------------------------------------------------------------------------------------------------------
Native      constructor         new instance using of() with 100 ints           10000   5.77ms
SlowList    constructor         new instance using of() with 100 ints           10000   1447.82ms
----------------------------------------------------------------------------------------------------------
Native      add                 add strings to list                             10000   1.00ms
SlowList    add                 add strings to list                             10000   28.26ms
----------------------------------------------------------------------------------------------------------
Native      add                 add ints to list                                10000   3.25ms
SlowList    add                 add ints to list                                10000   41.65ms
----------------------------------------------------------------------------------------------------------
Native      add_at              add_at fixed position with string               10000   21.93ms
SlowList    add_at              add_at fixed position with string               10000   684.87ms
----------------------------------------------------------------------------------------------------------
Native      add_at              add_at fixed position with int                  10000   21.45ms
SlowList    add_at              add_at fixed position with int                  10000   183.11ms
----------------------------------------------------------------------------------------------------------
Native      contains            contains with string                            10000   1.19ms
SlowList    contains            contains with string                            10000   106.24ms
----------------------------------------------------------------------------------------------------------
Native      contains            contains with int                               10000   0.96ms
SlowList    contains            contains with int                               10000   94.71ms
----------------------------------------------------------------------------------------------------------
Native      get                 get last element of list of size 100            10000   0.46ms
SlowList    get                 get last element of list of size 100            10000   104.16ms
----------------------------------------------------------------------------------------------------------
Native      index_of            index_of last string in list of size 100        10000   15.42ms
SlowList    index_of            index_of last string in list of size 100        10000   10365.40ms
----------------------------------------------------------------------------------------------------------
Native      index_of            index_of last int in list of size 100           10000   16.63ms
SlowList    index_of            index_of last int in list of size 100           10000   7364.60ms
----------------------------------------------------------------------------------------------------------
Native      last_index_of       last_index_of las string in list of size 100    10000   9.85ms
SlowList    last_index_of       last_index_of las string in list of size 100    10000   295.06ms
----------------------------------------------------------------------------------------------------------
Native      last_index_of       last_index_of last int in list of size 100      10000   9.08ms
SlowList    last_index_of       last_index_of last int in list of size 100      10000   225.17ms
----------------------------------------------------------------------------------------------------------
Native      remove              remove last string in list of size 100          10000   21.70ms
SlowList    remove              remove last string in list of size 100          10000   12636.32ms
----------------------------------------------------------------------------------------------------------
Native      remove              remove last string in list of size 100          10000   21.24ms
SlowList    remove              remove last string in list of size 100          10000   9124.89ms
----------------------------------------------------------------------------------------------------------
Native      remove_at           remove_at last int in list of size 100          10000   6.34ms
SlowList    remove_at           remove_at last int in list of size 100          10000   2270.03ms
----------------------------------------------------------------------------------------------------------
Native      size                size with string list of size 100               10000   0.80ms
SlowList    size                size with string list of size 100               10000   9.06ms
----------------------------------------------------------------------------------------------------------
Native      size                size with int list of size 100                  10000   0.94ms
SlowList    size                size with int list of size 100                  10000   7.40ms
----------------------------------------------------------------------------------------------------------
Native      set                 set last string in list of size 100             10000   0.48ms
SlowList    set                 set last string in list of size 100             10000   427.26ms
----------------------------------------------------------------------------------------------------------
Native      set                 set last int in list of size 100                10000   0.55ms
SlowList    set                 set last int in list of size 100                10000   430.91ms
----------------------------------------------------------------------------------------------------------
Native      to_string           to_string string list of size 100               10000   9.19ms
SlowList    to_string           to_string string list of size 100               10000   43.74ms
----------------------------------------------------------------------------------------------------------
Native      to_string           to_string int list of size 100                  10000   269.77ms
SlowList    to_string           to_string int list of size 100                  10000   38.11ms


정말 놀랍지 않습니다. 내 목록이 있는 to_string()를 제외한 모든 방법에서 기본 목록이 더 빠릅니다. 더 빠르게. Python의 목록에는 to_string()가 없으므로 ''.join(list)를 사용하여 만들었습니다.

결론



벤치마크 결과를 본 후 목록 유형의 이름이 명확해졌습니다 -- SlowList . 나보다 Python에 대해 더 잘 아는 사람이 더 빠르고 최적화할 수 있다고 확신하지만 물론 네이티브 목록만큼 빠르지는 않을 것입니다.

나는 이 프로젝트를 정말로 즐겼다. 나는 처음부터 아무도 그것을 사용하거나 Github에 별표를 표시하지 않을 것이라는 것을 알고 있었고 그것이 즐거움의 근원이었습니다. 나는 가치를 제공해야 한다는 생각에 너무 익숙해서 완전히 쓸모 없는 것을 만드는 것이 안도감을 느꼈습니다.

project on Github을 찾을 수 있습니다.

무엇 향후 계획? 🌌



이 프로젝트가 흥미롭다고 생각하고 기여하고 싶다면 몇 가지issues on Github를 볼 수 있습니다. 언제나 도움을 환영합니다 😊

자세히 알아보기 👩‍🏫



소프트웨어 엔지니어로서 자신을 성장시키는 방법에 대한 보다 진지한 주제는 다음 게시물을 확인하십시오.




  • 트위터에서 팔로우

    https://prplcode.dev에서 원래 게시됨

    좋은 웹페이지 즐겨찾기