본문 바로가기

app/python

(47)
pypy Python의 언어 구현 중 하나로, C로 짜인 기존의 CPython과 달리 Python으로 Python을 만드는 프로젝트이다. 이 프로젝트의 진짜 놀라운 점은 기존 CPython보다 전혀 느리지 않을뿐더러, 오히려 성능면에서 CPython을 능가하고 있다는 점이다. 1. 설치 $ apt install pypy 2. 사용 주피터에서는 그냥 상단에 %%pypy만 쓰면 된다. Just-In-Time (JIT) Compiler 이기 때문에 해당 단락만 pypy로 실행되기 때문이다. (다른 단락은 기존의 python이 실행된다) 그래서 각 단락마다 "import time"을 두번 했다 성능은? 9 배 차이.... 일반 커맨드에서 실행한다면 pypy로 실행하면 된다. $pypy ./test.py 499999999..
cython : python to C Cython 은 CPython 확장 모듈을 생성하고 이를 이용하여 외부 함수 인터페이스와 실행 속도 향상과 외부 라이브러리의 연동을 보다 향상 시킬 수 있도록 고안된 컴파일 언어이다 Cython 은 pyx 확장명을 사용하고, 컴파일 과정을 통하여 파이썬에서 import 형태로 사용될 수 있다. 컴파일은 다음 setup.py 를 이용하여 컴파일할 수 있다 1. cython 설치!! $ pip install cython 2. 변환할 파이썬 코드를 pyx 확장자로 생성 1 2 3 4 # test_cython.pyx def ret_list(n): return [i for i in range(n)] cs 3. setup.py 파일 생성 1 2 3 4 5 # setup.py # -*- coding: utf-8 -*..
ERROR: Cannot install -r /requirements.txt because these package versions have conflicting dependencies. pip로 패키지 설치시 같은 패키지에서 서로 다른 버전을 "==" 로 명시 했을때 pip 매니져는 무엇을 설치 할지 몰라서 conflict 에러를 뱉고 멈추게 된다. 고치는 방법으로 1. 특정 버전을 명시하지 말고 러프하게 하거나 (">="나 아예 버전을 명시하지 않는다. ) 2. 디팬던시된 패키지를 한쪽에서 삭제하라고 권고 한다. 만일 위의 방법을 할수 없는 상황이였다. 나의 경우 설치를 해야 하는 서로 다른 두개의 사내 패키지가 이미 버전이 고정되어 있어서 수정이 불가능한 상태. 이럴때는 같은 패키지를 재설치하려 할때 무조건 상위 버전으로 설치하라고 명시해주면된다. --upgrade --no-deps --force-reinstall pip install --upgrade --no-deps --forc..
parquet 데이터를 쉽게 접근할 수 있도록 csv로 저장해서 사용한다. 하지만 csv는 메타데이터를 저장할 수 없어 칼럼 별로 dtype을 다시 지정해줘야 하는 일이 생기며, 읽고 쓸 때 시간이 많이 걸린다는 단점이 있다. 이를 보완하기 위해 pickel, parquet, hdf5 와 같은 다양한 데이터 포맷을 사용하는데 그중 parquet에 대해서 알아본다 what is parquet? Apache Parquet는 데이터 처리 프레임워크, 데이터 모델 또는 프로그래밍 언어에 관계없이 Hadoop 생태계의 모든 프로젝트에서 사용할 수 있는 칼럼형 스토리지 형식 Columnar parquet의 저장 방식은 컬럼 지향으로 저장한다. 칼럼 단위의 값은 데이터가 유사할 가능성이 높다. 이로 인해 높은 압축률을 얻을 수 있..
pickle 1. pickle? 직렬화 : 개체를 메모리, DB, 파일에 저장하기 위해 개체를 바이트 스트림으로 변환하는 프로세스 언어마다 직렬화를 표현하는 단어가 다르다. java : 직렬화 python : 피클링 perl.. etc : 마샬링 사실 마샬링이 가장 큰 개념이다. 직렬화하는 모든 과정을 뜻하는 말이다. 2. 난 json 잘 쓰고 있는데? pickle vs json pickle과 JSON (JavaScript Object Notation) 에는 근본적인 차이가 있다. JSON은 텍스트 직렬화 형식(유니코드 텍스트를 출력하지만, 대개는 utf-8으로 인코딩)인 반면, pickle은 바이너리 직렬화 형식 JSON은 사람이 읽을 수 있지만, pickle은 그렇지 않다 JSON은 상호 운용이 가능하며 파이썬 ..
pip multiple versions of dependency resolver problem INFO: pip is looking at multiple versions of to determine which version is compatible with other requirements. This could take a while. INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime. If you want to abort this run, you can press Ctrl + C to do so. pip의 dependency resolver 문제로 pip의 최신 버전에서 나타나는 문제이다. 설치하려는 패키지와..
파이썬 부동소수점 사용시 주의할점 부동 소수점 오류 예 0.1 == 0.1 # True 0.2 == 0.1+0.1 # True 0.3 == 0.1+0.1+0.1 # False 0.4 == 0.2+0.2 # True 0.5 == 0.2+0.2+0.1 # True 0.6 == 0.2+0.2+0.2 # False 0.9 == 0.5+0.4 # True 0.9 == 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 # False 0.1을 100번 더하면 10이 나와야 되는데... 0.1을 정확히 표현할 수 없기 때문에 발생하는 오류입니다. result = 0.0 for i in range(0, 100): result += 0.1 print(result) 이 모든것은 부동 소수점에서 발생하는 문제이다. 소수점 연산은 정확한 연산을 ..
array의 연산을 빠르게 하는 방법 import timeit arr = [i for i in range(4000 * 4000)] def slow_sum(): sum = 0 for x in range(4000): for y in range(4000): sum += arr[x + 4000 * y] # print(sum) # 127999992000000 def fast_sum(): sum = 0 for x in range(4000): for y in range(4000): sum += arr[x * 4000 + y] # print(sum) # 127999992000000 timer1 = timeit.Timer('slow_sum()', setup='from __main__ import slow_sum') t1 = timer1.timeit(numb..