• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01
Carousel 02
Previous Next

'Programming/Python'에 해당되는 글 58건

  • 2021.04.01 tqdm 과 enumerate
  • 2021.03.10 Call by Value? Call by Reference??
  • 2021.01.19 python2.X 에서 opencv-python을 설치하자
  • 2021.01.11 list에서 중복 내용을 제거하자
  • 2020.12.14 os에 따른 기본 파일 인코딩 형식
  • 2020.12.01 데이터와 인덱스를 알려주는 enumerate
  • 2020.10.28 CondaVerificationError를 해결하자
  • 2020.05.27 폴더의 이름을 일괄 변경하자
  • 2020.05.18 Python array에서 extended slices를 사용하자
  • 2020.05.12 Anaconda 가상환경 구동 및 프로그램실행을 batch로 만들자 1
  • 2020.03.09 python에서의 Asterisk는 무슨일을 하는가.
  • 2020.01.07 골뱅이, decorator를 이용하여 함수 실행시간을 측정하자.
  • 2020.01.02 python-virtualenv를 이용해 가상환경을 설정하자
  • 2019.12.02 설정 값 저장을 위해 ConfigParser를 이용 해 보자.
  • 2019.11.13 상태 진행률을 시각적으로 표현하자 (tqdm)
  • 2019.11.06 conda 기존 환경을 복사하여 새로운 환경을 만들자 4
  • 2019.09.20 pip에서 ImportError: cannot import name 'main' 를 해결하자
  • 2019.09.04 imread, imwrite 에서 한글(유니코드)로 인한 문제를 해결하자 3
  • 2019.09.03 python 2.X에서 dump한 pickle 3.X 버전에 읽기
  • 2019.08.14 list 생성과 초기화 같이 하자

tqdm 과 enumerate

Programming/Python 2021. 4. 1. 15:28




data loader 등을 사용하다 보면 자주 쓰이는 tqdm과 enumerate.

 

보통 코드에 기본적으로 enumerate를 사용하게 구현되어있고 

여기에 프로그레스 정보를 보고싶어 tqdm으로 감싸주면 정보가 제대로 표시되지 않는 문제가 발생한다.

 

이 문제는 생각보다 간단한 문제로

tqdm을 겉에 두르면 이녀석이 관찰하는 데이터는 enumerate의 정보이기 떄문에 제대로 표시가 안 된 것이다.

 

해결방법은 더 간단하게 enumerage와 tqdm의 순서를 바꿔주면 된다.

 

# tqdm progress 정보 제대로 출력 X
for ii, data in tqdm(enumerate(dataset)):

# tqdm progesss 정보 제대로 출력 O
for ii, data in enumerate(tqdm(dataset)):

 

저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

설치된 라이브러리 리스트를 requirements.txt 로 만들자.  (0) 2021.06.18
반올림은 반올림이 아니다? round의 처리 방법  (0) 2021.04.13
Call by Value? Call by Reference??  (0) 2021.03.10
python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
list에서 중복 내용을 제거하자  (0) 2021.01.11
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Call by Value? Call by Reference??

Programming/Python 2021. 3. 10. 16:35




python을 사용하면서 막연히 파이썬의 함수 파라메터는 call by value 방식이라고 생각했다.

 

문득 내가 쓰는 코드를 보니 왜 그렇게 짰는지도 모르겠지만 call by reference 형태로 동작하는 

코드를 짜서 쓰고있는 부분을 발견.. 

 

그럼 파이썬은 call by value야? call by reference야?.. 궁금해서 찾아본 결과는

파이썬은 call by assignment 방식 또는 call by object reference 라고 표현하더라.

 

<파이썬 알고리즘 인터뷰>  p.107, 책만, 2020

어떤 의미냐 하면 우선 파이썬의 표준타입들을 보면 여러 타입이 있지만 그 중에서 

상수(숫자), 문자열, 바이트, 튜플 이 네가지 타입은 불변 타입이고 나머지 타입은 가변타입이다.

 

파라미터로 사용될때 불변타입은 값 변경이 불가능하여 새로운 객체로 복사전달되어 call by value 처럼 동작하고,

나머지 가변타입들은 값 변경이 가능하여 call by reference 방식으로 동작하게 된다.

 

막연히 사용하던 내용인데 이 부분도 참 편하다 파이썬..

저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

반올림은 반올림이 아니다? round의 처리 방법  (0) 2021.04.13
tqdm 과 enumerate  (0) 2021.04.01
python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
list에서 중복 내용을 제거하자  (0) 2021.01.11
os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

python2.X 에서 opencv-python을 설치하자

Programming/Python 2021. 1. 19. 08:00




 

요즘이야 python 3.x를 보통 사용하니 별 문제가 될일이 없지만

가끔 python2.x 버전을 사용해야 하는 경우가 있다.

 

이런 환경에서 opencv-python을 설치하려 하면 버전 문제로 설치가 안되는 경우가 발생한다.

이는 opencv-python 최신 버전에서 더이상 python2버전을 지원하지 않기 때문이다.

버전 history에 관한 자세한 내용은 아래 pypi 사이트에서 확인할 수 있다.

pypi.org/project/opencv-python/#history

 

opencv-python

Wrapper package for OpenCV python bindings.

pypi.org

 

그래서 아래와 같이 python2버전을 지원하는 버전으로 지정하여 설치하면 된다.

파이썬 2버전을 지원하는 마지막 opencv-python 은 4.2.0.32 버전이다.

 

$ pip2 install opencv-python==4.2.0.32

저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

tqdm 과 enumerate  (0) 2021.04.01
Call by Value? Call by Reference??  (0) 2021.03.10
list에서 중복 내용을 제거하자  (0) 2021.01.11
os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
데이터와 인덱스를 알려주는 enumerate  (0) 2020.12.01
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

list에서 중복 내용을 제거하자

Programming/Python 2021. 1. 11. 06:31




리스트를 이용하여 데이터를 관리하다 보면 중복 데이터가 발생하는 경우가 있다.

 

중복 데이터 제거가 필요한 경우를 위하여 방법 기록.

 


1. for문을 이용한 중복 제거 (순서 유지)

반복문을 이용하여 새로운 리스트에 값을 append. 이 과정에서 새로운 리스트에 값이 있으면 skip.

old_list = [1, 2, 3, 1, 3, 4, 5, 6, 7]
new_list = []

for ii in old_list:
	if ii not in new_list:
    	new_list.append(ii)

return new_list
# new_list == [1, 2, 3, 4, 5, 6, 7]

 

2. set을 이용한 중복 제거 (순서 유지 안됨)

중복데이터를 허용하지 않는 set 자료형을 이용하여 형변환을 이용한 중복 제거. 이 과정에서 순서는 보장 X

old_list = [1, 2, 3, 1, 3, 4, 5, 6, 7]
temp_set = set(old_list)
new_list = list(temp_set)

return new_list
# new_list == [1, 2, 3, 4, 5, 6, 7]
# 단, 순서는 원 데이터에 따라 달라질 수 있음.
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

Call by Value? Call by Reference??  (0) 2021.03.10
python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
데이터와 인덱스를 알려주는 enumerate  (0) 2020.12.01
CondaVerificationError를 해결하자  (0) 2020.10.28
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

os에 따른 기본 파일 인코딩 형식

Programming/Python 2020. 12. 14. 14:57




 

파이썬에서 파일을 저장할 때 인코딩 방식이 정해지면

다시 읽을때도 해당 방식으로 디코딩을 해야 정상적인 데이터를 읽을 수 있다.

 

나의 경우에는 보통 이런 문제는 windows <-> linux 환경에서 자주 겪었다.

 

매번 어떤 환경에서 어떤 방식을 썼는지 햇갈리니 일단 기록.

 


1. 인코딩 방식 확인하기

1.1 기본 시스템 인코딩 타입 확인하기

import sys

sys.stdin.encoding
# cp949

sys.stdout.encoding
# cp949

1.2 라이브러리를 이용하여 문자열 / 파일의 인코딩 타입 확인하기

# chardet 라이브러리를 이용
# pip install chardet


import chardet

# 문자열
str = "example text"
print(chardet.detect(str.encode))
# {'encoding': 'cp949', 'confidence': 0.99, 'language': ''}

# 파일
with open("./example_file.txt", 'r') as file:
	line = file.readline()
    
    print(chardet.detect(line.encode()))
    # # {'encoding': 'cp949', 'confidence': 0.99, 'language': ''}

 

2. encoding= 파라미터로 인코딩 방식 지정하기

with open("./example_file.txt", 'r', encoding="cp949") as file:
	line = file.readline()

 

3. (참고용) os에 따른 기본 인코딩 타입 (python 3.7 기준)

  • windows : cp949
  • linux : utf-8

파이썬 버전에 따른 인코딩 타입이 다른지는 모르겠다. (확인되면 수정하기)

euc-kr 도 종종 보이나 cp949가 euc-kr의 상위 버전이므로 가능하면 cp949를 사용하자.

저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
list에서 중복 내용을 제거하자  (0) 2021.01.11
데이터와 인덱스를 알려주는 enumerate  (0) 2020.12.01
CondaVerificationError를 해결하자  (0) 2020.10.28
폴더의 이름을 일괄 변경하자  (0) 2020.05.27
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

데이터와 인덱스를 알려주는 enumerate

Programming/Python 2020. 12. 1. 07:47




for문과 함께 많이 사용하는 기능 중 꽤나 유용한 enumerate.

 

일반적으로 순회할 데이터를 enumerate로 감싸서 데이터와 인덱스를 받아오는데 사용한다.

 

# data list
data = ["red", "blue", "green", "black", "white"]

# range를 이용한 인덱스와 데이터 출력
for ii in range(len(data)):
	output = "Idx : %d / Data : %s" % (ii, data[ii])
    print(output)

# enumerate를 이용한 인덱스와 데이터 출력
# range, len 함수를 하나로 줄이고 데이터에 인덱스로 접근하는 과정을 생략
for ii, color in enumerate(data):
	output = "Idx : %d / Data : %s" % (ii, color)
    print(output)
# Idx : 0 / Data : red
# Idx : 1 / Data : blue
# Idx : 2 / Data : green
# Idx : 3 / Data : black
# Idx : 4 / Data : white

 

일반적으로는 enumerate에 첫번째 파라미터만 채워서 사용했는데

두번쨰 파라미터로 시작인덱스값을 지정 가능하다는것을 알게되어 기록

# data list
data = ["red", "blue", "green", "black", "white"]

# enumerate를 이용한 인덱스와 데이터 출력
# 두번째 파라미터로 시작 인덱스를 지정할 수 있다.
for ii, color in enumerate(data, 100):
	output = "Idx : %d / Data : %s" % (ii, color)
    print(output)
# Idx : 100 / Data : red
# Idx : 101 / Data : blue
# Idx : 102 / Data : green
# Idx : 103 / Data : black
# Idx : 104 / Data : white
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

list에서 중복 내용을 제거하자  (0) 2021.01.11
os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
CondaVerificationError를 해결하자  (0) 2020.10.28
폴더의 이름을 일괄 변경하자  (0) 2020.05.27
Python array에서 extended slices를 사용하자  (0) 2020.05.18
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

CondaVerificationError를 해결하자

Programming/Python 2020. 10. 28. 09:44




conda 를 이용하여 특정 패키지를 설치를 시도하던 중 아래와 같은 에러를 만났다.

 

```

CondaVrificationError: The package for pytorch located at C:\~~~~~ 

appears to be corrupted. The path "Lib/site-packages/~~~~~.dll"

specified in the package manifest cannot be found.

```

 

이와 같은 경우 이전에 사용했던 버전 등에서 남은 찌꺼기로 인한 문제로 보여진다.

불필요한 파일을 싹 정리 해주고 다시 설치를 시도하면 정상적으로 설치가 가능하다.

 


# 불필요한 파일 제거 
>> conda clean --all
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
데이터와 인덱스를 알려주는 enumerate  (0) 2020.12.01
폴더의 이름을 일괄 변경하자  (0) 2020.05.27
Python array에서 extended slices를 사용하자  (0) 2020.05.18
Anaconda 가상환경 구동 및 프로그램실행을 batch로 만들자  (1) 2020.05.12
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

폴더의 이름을 일괄 변경하자

Programming/Python 2020. 5. 27. 14:48




대용량의 데이터베이스를 사용하다보면 가끔 폴더의 이름을 일괄 변경하고 싶은 경우가 있다.

 

이럴경우 양이 많지 않으면 흔히 사용하는 DarkRenamer 등의 프로그램을 쓸수도 있지만

폴더/파일의 양이 많은 빅데이터를 다룰때는 이러한 프로그램이 감당을 못한다.

 

그래서 폴더명만 일괄적으로 변경하는 함수를 기록해 두고 필요할때 사용하자..

 


# -*- coding: utf-8 -*-
import sys
import os
from os import rename, listdir


def rename_folder(sRoot):
    # 현재 위치의 파일 목록
    files = listdir(sRoot)

    # 파일명에 번호 추가하기
    count = 0
    for name in files:

        # 파이썬 실행파일명은 변경하지 않음
        if sys.argv[0].split("\\")[-1] == name:
            continue

        new_name = "{0:05d}".format(count)
        rename(os.path.join(sRoot, name), os.path.join(sRoot, new_name))
        count += 1
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

데이터와 인덱스를 알려주는 enumerate  (0) 2020.12.01
CondaVerificationError를 해결하자  (0) 2020.10.28
Python array에서 extended slices를 사용하자  (0) 2020.05.18
Anaconda 가상환경 구동 및 프로그램실행을 batch로 만들자  (1) 2020.05.12
python에서의 Asterisk는 무슨일을 하는가.  (0) 2020.03.09
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Python array에서 extended slices를 사용하자

Programming/Python 2020. 5. 18. 09:27




파이썬 코드를 보다 낯선 문법을 보고 어떤 의미인지 찾아보다 extended slices 에 대하 찾게 되었다.

https://docs.python.org/release/2.3.5/whatsnew/section-slices.html

 

15 Extended Slices

15 Extended Slices Ever since Python 1.4, the slicing syntax has supported an optional third ``step'' or ``stride'' argument. For example, these are all legal Python syntax: L[1:10:2], L[:-1:1], L[::-1]. This was added to Python at the request of the devel

docs.python.org

 

여기서 문제가 됐던 문법은 array[::] 에 관한 부분이다. 

 

array[A:B:C] 라고 사용하면 이는 array중 A에서 B 까지 C 간격으로 배열을 생성한다는 의미이다.

 

A, B, C가 각각 None이라면

A는 처음부터 (0번 index)

B는 가능한 index까지 

C는 1을 의미한다.

 

간단한 예시를 보면 아래와 같다.

>> arr = range(10) 
>> arr [0,1,2,3,4,5,6,7,8,9] 
>> arr[::2] # 처음부터 끝까지 두 칸 간격으로 
   # [0,2,4,6,8] 

>> arr[1::2] # index 1 부터 끝까지 두 칸 간격으로 
   # [1,3,5,7,9] 

>> arr[::-1] # 처음부터 끝까지 -1칸 간격으로 ( == 역순으로) 
   # [9,8,7,6,5,4,3,2,1,0] 
   
>> arr[::-2] # 처음부터 끝까지 -2칸 간격으로 ( == 역순, 두 칸 간격으로) 
   # [9,7,5,3,1] 

>> arr[3::-1] # index 3 부터 끝까지 -1칸 간격으로 ( == 역순으로) 
   # [3,2,1,0] 
   
>> arr[1:6:2] # index 1 부터 index 6 까지 두 칸 간격으로 
   # [1,3,5]

 

이런 단순 배열 뿐만 아니라 Image를 다룰때 간단한 flip을 구현하는데도 사용 가능하다.

# image는 tensor와 같은 순서로 H, W, C 순서라 가정하고..

# h flip
img = img[:, ::-1, :]

# v flip
img = img [::-1, :, :]
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

CondaVerificationError를 해결하자  (0) 2020.10.28
폴더의 이름을 일괄 변경하자  (0) 2020.05.27
Anaconda 가상환경 구동 및 프로그램실행을 batch로 만들자  (1) 2020.05.12
python에서의 Asterisk는 무슨일을 하는가.  (0) 2020.03.09
골뱅이, decorator를 이용하여 함수 실행시간을 측정하자.  (0) 2020.01.07
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Anaconda 가상환경 구동 및 프로그램실행을 batch로 만들자

Programming/Python 2020. 5. 12. 11:19




anaconda 가상환경을 구축하고 사용 할 경우 특정 코드를 실행시키기 위해서는 몇번의 단계가 있다.

anaconda prompt 실행 - conda env activete - path 이동 - 코드 실행...

 

자주 사용 할 경우에는 매번 이렇게 반복 작업을 하기 번거로우니 batch 파일로 만들어 두면 편하다.

 

(왜인지는 모르겠는데 cmd에서는 단순 명령어가 바로 실행 됐는데 아나콘다 환경으로 넘어간 뒤에는 call 명령어로 불러줘야 동작하던데.. )

 


 

set root=C:\Miniconda3
call %root%\Scripts\activate.bat %root%

call conda env list
call conda activate [env_name]
call cd [path]
call python [file_name.py]

pause

 

위와같이 메모장 등에서 코드를 작성하고 저장할때 *.bat 파일로 저장 해 주면 

이후 해당 bat 파일을 더블클릭해서 실행하면 자동으로 환경 연결되고 프로그램 실행까지 가능하다.

저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

폴더의 이름을 일괄 변경하자  (0) 2020.05.27
Python array에서 extended slices를 사용하자  (0) 2020.05.18
python에서의 Asterisk는 무슨일을 하는가.  (0) 2020.03.09
골뱅이, decorator를 이용하여 함수 실행시간을 측정하자.  (0) 2020.01.07
python-virtualenv를 이용해 가상환경을 설정하자  (0) 2020.01.02
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

python에서의 Asterisk는 무슨일을 하는가.

Programming/Python 2020. 3. 9. 16:33




C++ 에서 포인터에 고통받다 python을 쓰기 시작하면서 한동안 asterisk는 곱셈, 제곱승 등의 연산에서만 봤다

 

그러나 이런저런 코드를 보다보니 c++에서 많이 보던 형태로 사용되는 것을 보고 어떤 역할인지 궁금해서 

찾아보고 나중을 위해 정리 해 둔다.

 

맨 아래에 내가 이해하기 위해 참고한, 보다 자세한 예제가 있는 원본 주소를 추가.


Python 에서 Asterisk 의 사용처

1. 곱셈, 제곱승 

2. 리스트 확장

3. 가변인자

4. unpacking

 

1, 2 번은 자주 쓰고 다 아니까 넘어가고..

 

3. 가변인자

함수의 파라미터로 값을 넘길때 파라미터의 개수가 결정되지 않은 경우 가변인자의 형태로 사용가능

키워드 없이 위치로 결정되는 positional arguments는 * 로 (일반적으로는 *args)

키워드를 갖는 keyword arguments는 **로 사용한다. (일반적으로는 **kwargs)

두가지를 결합해서 사용 할 경우에는 일반 파라미터 규칙과 동일하게 * 를 **보다 앞서서 사용해야 한다.

이러한 형태로 전달하는 과정을 packing 이라 하고 각각 tuple과 dict에 저장된다.

def print_data(*args, **kwargs):
	print(args)
    print(kwargs)
    
print_data("data1", "data2", "data3", kwdata1="data4", kwdata2="data5")
# ("data1", "data2", "data3")
# {"kwdata1": "data4", "kwdata2": "data5"}

 

4. unpacking

이는 3번의 packing개념의 반대로 tuple 이나 dict 데이터를 각각의 데이터를 풀어내는 것이다.

def mult(a, b):
	return a*b
    
mult(2, 2)
# 4

c = {"a": 2, "b": 2}
mult(c["a"], c["b"])
# 4

mult(c)
# error!!

mult(**c)
# 4

 

 

참고 : https://mingrammer.com/understanding-the-asterisk-of-python/#3-%EA%B0%80%EB%B3%80%EC%9D%B8%EC%9E%90-variadic-parameters-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0%EC%9E%90-%ED%95%A0-%EB%95%8C

 

파이썬의 Asterisk(*) 이해하기

파이썬은 타 언어에 비해 비교적 연산자 및 연산의 종류가 풍부한 편이다. 특히 파이썬이 지원하는 많은 연산자중 하나인 Asterisk(*)는 단순히 곱셈 이상의 여

mingrammer.com

 

저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

Python array에서 extended slices를 사용하자  (0) 2020.05.18
Anaconda 가상환경 구동 및 프로그램실행을 batch로 만들자  (1) 2020.05.12
골뱅이, decorator를 이용하여 함수 실행시간을 측정하자.  (0) 2020.01.07
python-virtualenv를 이용해 가상환경을 설정하자  (0) 2020.01.02
설정 값 저장을 위해 ConfigParser를 이용 해 보자.  (0) 2019.12.02
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

골뱅이, decorator를 이용하여 함수 실행시간을 측정하자.

Programming/Python 2020. 1. 7. 12:18




프로그램을 구현하다 보면 특정 기능이 어느정도 시간을 소요하는지 확인이 필요한 경우가 있다.

 

이럴때 보통 아래와 같이 시간 측정을 위한 code 앞뒤에서 time 라이브러리를 이용하여 시간을 계산했다.

import time

start_time = time.time()

# 실행시간을 측정 할 code
# ~~~~~~~~~~~~~~~~~~~~~

print("Processing time : %.2f ms" % ((time.time() - start_time)*1000))

하지만 이런 방법은 한두군데 확인 하거나 잠깐 확인 할 때는 괜찮지만 

작성하는 부분이 많아질수록 가독성도 떨어지고 관리가 불편하다는 단점이 있다.

 


그래서 사용 가능한 기능이 파이썬의 데코레이터 라는 기능!

함수 이전에 선언이 필요하고 선언 후에는 실행 할 함수 앞에 @ 키워드와 함께 호출해주면

해당 함수를 wrapping 해줘서 decorator에 정의된 기능을 함께 수행 하게 된다.

 

import time

# decorator는 다른 함수보다 앞서 선언되어야 한다!
def processing_time(func):
    def wrapper_fn(*args, **kwargs):
    	start_time = time.time()
        func_result = func(*args, **kwargs)
        print("Processing time : %.2f ms" % ((time.time()-start_time)*1000))
        return func_result
    return wrapper_fn

@ precessing_time
def function_01():
    # 실행시간을 측정하고 싶은 함수 선언
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    print("function_01")

def function_02():
    # decorator 사용 안할 함수는 일반적으로 그대로 사용하면 된다.
    print("function_02")

if __name__ == "__main__":
    function_01()
    function_02()

 

이러한 기능을 이용하여 나는 deeplearning model의 inference time을 측정하는 함수를 만들어 사용 중이다.

import time

# decorator는 다른 함수보다 앞서 선언되어야 한다!
def processing_time(func):
    def wrapper_fn(*args, **kwargs):
    	start_time = time.time()
        func_result = func(*args, **kwargs)
        print("Processing time : %.2f ms" % ((time.time()-start_time)*1000))
        return func_result
    return wrapper_fn

@ processing_time
def get_forward(model, data):
    return model(data)


if __name__ == "__main__":
    # model & data 선언
    get_forward(model, data)

 

 

참고자료 : http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-decorator/

저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

Anaconda 가상환경 구동 및 프로그램실행을 batch로 만들자  (1) 2020.05.12
python에서의 Asterisk는 무슨일을 하는가.  (0) 2020.03.09
python-virtualenv를 이용해 가상환경을 설정하자  (0) 2020.01.02
설정 값 저장을 위해 ConfigParser를 이용 해 보자.  (0) 2019.12.02
상태 진행률을 시각적으로 표현하자 (tqdm)  (0) 2019.11.13
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

python-virtualenv를 이용해 가상환경을 설정하자

Programming/Python 2020. 1. 2. 12:41




python 개발을 하면 가상환경의 필요성이 크다.

나는 보통은 anaconda를 이용해 conda 환경을 주로 사용하였는데 anaconda를 사용하지 못하는 환경에서는

virtualenv 패키지를 이용하여 가상환경을 설정해야 하네.. 

일단 사용방법 정리

 


Virtualenv 설치

  • 가상환경 생성을 위해 virtualenv는 시스템에 설치 필요

sudo pip install virtualenv virtualenvwrapper

가상환경 생성 및 활성화

  • 환경 생성 후 활성화는 source 를 통해 가능

# python 버전 지정을 위해서는 -p 파라미터 사용 
virtualenv -p python3 [env_name] 

# 가상환경 활성화 
source [env_path]/bin/activate

VirtualenvWrapper 설정

  • 일반적으로 virtualenv에 진입하기 위해서는 설정한 위치로 이동 후
    [env_name]/bin/activate를 이용하여 활성화 필요.
    모든 가상환경 경로를 기억 및 해당 경로에서 실행필요

  • wrapper를 이용하면 현재 경로와 관계없이 활성화 가능하게 해줌

# .bashrc / .profile 같은 스크립트에 아래 코드 추가 
#----------- 스크립트에 추가 하기 ------------------------------------- 
# virtualenv 기본 경로 및 기본 파이썬 선언 
export WORKON_HOME=~/.virtualenvs 
export VIRTUALENVWRAPPER_PYTHON="$(which python3)" # Usage of python3 
source /usr/local/bin/virtualenvwrapper.sh 
#----------- 스크립트에 추가 하기 ------------------------------------- 
# 스크립트 활성화 
source ~/.profile # or source ~/.bashrc

VirtualenvWrapper 명령어

  • wrapper를 사용하면 현재 위치 관계없이 전역에서 사용 가능.

# 가상환경 생성 
mkvirtualenv [env_name] 

# 가상환경 제거 
rmvirtualenv [env_name] 

# 가상환경 목록 보기 
workon 

# 가상환경 활성화 
workon [env_name] 

# 가상환경 비활성화 (환경 활성화 중에) 
deactivate

# 프로젝트 디렉토리 맵핑
setvirtualenvproject

# 프로젝트 디렉토리 맵핑이 된 경우
# 아래 커맨드로 바로 프로젝트 디렉토리로 이동 가능
cdproject
 
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

python에서의 Asterisk는 무슨일을 하는가.  (0) 2020.03.09
골뱅이, decorator를 이용하여 함수 실행시간을 측정하자.  (0) 2020.01.07
설정 값 저장을 위해 ConfigParser를 이용 해 보자.  (0) 2019.12.02
상태 진행률을 시각적으로 표현하자 (tqdm)  (0) 2019.11.13
conda 기존 환경을 복사하여 새로운 환경을 만들자  (4) 2019.11.06
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

설정 값 저장을 위해 ConfigParser를 이용 해 보자.

Programming/Python 2019. 12. 2. 16:35




python을 사용하다 보면 다양한 설정값을 사용하는 경우가 있다.

이럴 때마다 매번 값을 코드에 써주자니 귀찮고.. 설정 값 저장 해두고 불러쓰면 좋잖아??

 

그래서 사용 할 모듈이 python 내장 모듈 중 하나인 configparser!!

언제나 그렇듯 다음번 사용을 위해 방법 정리.

 


# -*- coding:utf-8 -*-
import configparser

# configParser 생성
conf = configparser.ConfigParser()

# 기존 config 파일이 있을 경우
conf.read("./config.ini")
# config 파일은 아래와 같은 형태로 저장 됨.
# [section1]
# sec1_option1 = option1
# sec1_option2 = option2
#
# [section2]
# sec2_option1 = option1
# sec2_option2 = option2


##### parser read #####
# section list 읽기
section_list = conf.sections()

# section 내 option list 읽기
option_list = conf.options("section_name")

# 특정 section 존재 확인
conf.has_section("section_name")

# section 내 option 과 값 list 읽기
opt_val_list = conf.items("section_name")

# 직접 section / variable 값 읽기
train_path = conf["section_name"]["option_name"]
# 또는
train_path = conf.get("section_name", "option_name")
# 자료형에 따라 getint, getfloat, getboolean 사용하면 읽기와 형변환 같이 함


##### parser write #####
# section 생성
conf.add_section("new_section_name")

# section 삭제
conf.remove_section("remove_section_name")

# option 추가
conf.set("section_name", "option_name", value)

# option 삭제
conf.remove_option("section_name", "option_name")

# parser에 내용을 추가 해 중 뒤에는 반드시 write 해줘야 함
with open(conf_file_path, "w") as fp:
    conf.write(fp)
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

골뱅이, decorator를 이용하여 함수 실행시간을 측정하자.  (0) 2020.01.07
python-virtualenv를 이용해 가상환경을 설정하자  (0) 2020.01.02
상태 진행률을 시각적으로 표현하자 (tqdm)  (0) 2019.11.13
conda 기존 환경을 복사하여 새로운 환경을 만들자  (4) 2019.11.06
pip에서 ImportError: cannot import name 'main' 를 해결하자  (0) 2019.09.20
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

상태 진행률을 시각적으로 표현하자 (tqdm)

Programming/Python 2019. 11. 13. 18:08




뭔가 연속적인 작업을 수행할때 진행률을 알고 싶은 경우가 있다.

보통은 상태로그를 만들어서 출력하는 방식으로 확인을 했었다. 

근데 이제 조금 더 깔끔하게 상태진행률을 알고싶단말이지..

그럴 떄는 tqdm 라이브러리를 사용하여 처리가 가능하다


사용법은 매우 간단하다.

 

1. tqdm 설치하기

# conda
conda install tqdm

# pip
pip install tqdm

 

2. tqdm import 하기

from tqdm import tqdm

 

3. tqdm 사용하기

기존의 for 문에서 range 위치에 tqdm 으로 감싸주기만 하면 끝.

# tqdm 적용 전
for ii in range(100):
	print(ii)
    time.sleep

# tqdm 적용
for ii in tqdm(range(100)):
	# print 문이 for문 안에 있으면 상태바가 새로 출력됨.
    # print(ii)
	# sleep 없으면 너무 빨리 지나가서 상태 확인용
    time.sleep(0.1)

 

4. tqdm 에 옵션 설정하기 (Optional)

# desc 에 진행 작업에 대한 설명을 추가 가능
# mininterval에 최소 업데이트 주기를 설정 가능
for ii in tqdm(range(100), desc="tqdm example", mininterval=0.01):
    # print(ii)
    time.sleep(0.1)

 

이와같이 적용하면 여러줄 출력 안하고 한줄 내에서 상태 갱신되면서 작업 진행률이 표시 된다.

 

tqdm example:  14%|█▍        | 14/100 [00:01<00:08,  9.95it/s]

tqdm example:  49%|████▉     | 49/100 [00:04<00:05,  9.95it/s]

tqdm example:  92%|█████████▏| 92/100 [00:09<00:00,  9.96it/s]

tqdm example: 100%|██████████| 100/100 [00:10<00:00,  9.95it/s]

 

 

보다 자세한 사용법 등을 알고 싶으면 github에서 확인 가능하다

https://github.com/tqdm/tqdm

저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

python-virtualenv를 이용해 가상환경을 설정하자  (0) 2020.01.02
설정 값 저장을 위해 ConfigParser를 이용 해 보자.  (0) 2019.12.02
conda 기존 환경을 복사하여 새로운 환경을 만들자  (4) 2019.11.06
pip에서 ImportError: cannot import name 'main' 를 해결하자  (0) 2019.09.20
imread, imwrite 에서 한글(유니코드)로 인한 문제를 해결하자  (3) 2019.09.04
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

conda 기존 환경을 복사하여 새로운 환경을 만들자

Programming/Python 2019. 11. 6. 10:22




기존 환경에 설치된 라이브러리들을 동일하게 사용할건데 개발 환경은 분리하고 싶을 경우 다시 설치하려면 시간만 엄청 오래걸리지..


이럴 경우 기존 환경을 복사하여 새로운 환경을 만드는 방법.



가상환경 복제하여 새로 생성

$ conda create -n [env-name] --clone [src-env-name]


저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

설정 값 저장을 위해 ConfigParser를 이용 해 보자.  (0) 2019.12.02
상태 진행률을 시각적으로 표현하자 (tqdm)  (0) 2019.11.13
pip에서 ImportError: cannot import name 'main' 를 해결하자  (0) 2019.09.20
imread, imwrite 에서 한글(유니코드)로 인한 문제를 해결하자  (3) 2019.09.04
python 2.X에서 dump한 pickle 3.X 버전에 읽기  (0) 2019.09.03
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

pip에서 ImportError: cannot import name 'main' 를 해결하자

Programming/Python 2019. 9. 20. 09:23




pip를 사용하다 간혹 아래와 같은 에러를 만나는 경우가 있다.

ImportError: cannot import name 'main'

 

이는 pip 업데이트 과정 중에서 뭔가 경로가 꼬여서 발생하는것 같은데 정확한 원인은 모르겠다..

어쩄든 pip가 업데이트 되다 문제가 되었으니 pip를 다시 설정 해주면 해결 가능.

 

# python 2
sudo python -m pip uninstall pip && sudo apt-get install python-pip --reinstall

# python3
sudo python3 -m pip uninstall pip && sudo apt-get install python3-pip --reinstall
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

상태 진행률을 시각적으로 표현하자 (tqdm)  (0) 2019.11.13
conda 기존 환경을 복사하여 새로운 환경을 만들자  (4) 2019.11.06
imread, imwrite 에서 한글(유니코드)로 인한 문제를 해결하자  (3) 2019.09.04
python 2.X에서 dump한 pickle 3.X 버전에 읽기  (0) 2019.09.03
list 생성과 초기화 같이 하자  (0) 2019.08.14
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

imread, imwrite 에서 한글(유니코드)로 인한 문제를 해결하자

Programming/Python 2019. 9. 4. 10:53




python에서 opencv를 사용하면서 한글(유니코드)로 인한 문제가 발생 할 경우가 있다.

python의 opencv에서는 유니코드를 처리하지 못하기 때문에 발생하는 문제라고 한다.

 

이러한 경우 아래와 같이 imencode 함수를 이용하여 우회하는 방식으로 해결 가능하다.


<imread>

import numpy as np
import cv2
def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8):
    try:
        n = np.fromfile(filename, dtype)
        img = cv2.imdecode(n, flags)
        return img
    except Exception as e:
        print(e)
        return None

 

<imwrite>

import numpy as np
import cv2
import os
def imwrite(filename, img, params=None):
    try:
        ext = os.path.splitext(filename)[1]
        result, n = cv2.imencode(ext, img, params)

        if result:
            with open(filename, mode='w+b') as f:
                n.tofile(f)
            return True
        else:
            return False
    except Exception as e:
        print(e)
        return False
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

conda 기존 환경을 복사하여 새로운 환경을 만들자  (4) 2019.11.06
pip에서 ImportError: cannot import name 'main' 를 해결하자  (0) 2019.09.20
python 2.X에서 dump한 pickle 3.X 버전에 읽기  (0) 2019.09.03
list 생성과 초기화 같이 하자  (0) 2019.08.14
list 에서 최대값과 최대값의 index를 찾아보자  (0) 2019.08.14
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

python 2.X에서 dump한 pickle 3.X 버전에 읽기

Programming/Python 2019. 9. 3. 17:56




모든 경우에 해당하는지는 확인하지 못함.

내 경우는 파이썬 2.X 버전에서 pickle을 dump 하고 3.X 버전에서 load 한 경우 아래와 같은 에러가 발생

>> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128)

근본적인 이유를 찾아보니 python2 버전과 3버전에서는 문자열을 다루는 방식이 다르다.


Python2 vs Python3 : string handling

  • python2 : this string literal is called a "str" object but its stored as bytes. If you prefix it with "u" you get a "unicode" object which is stored as Unicode code points.
  • python3 : this string literal is a "str" object that stores Unicode code points by default. You can prefix it with "b" to get a bytes object or use .encode.

즉, 2버전에서는 byte, 3버전에서는 unicode를 기본 데이터 타입으로 사용한다.

그렇다면 읽을때 바이트 타입으로 읽어주면 되겠지..

with open(filePath, 'rb') as f: 
	data = pickle.load(f, encoding='byte')

혹 pickle에 데이터를 딕셔너리로 저장 했을경우 읽을때 key 값 앞에도 'b'를 붙여줘서 byte로 읽자

sID 	 = data[b"userID"] 
sAddress = data[b"userAddress"] 
...

 


 

위 방법이 안통해서 찾은 다른방법 (20.02.11. 추가)

with open(picklePath,'rb') as file: # Binary read
    u = pickle._Unpickler(file)
    u.encoding = 'latin1'
    p = u.load()

 

 
저작자표시 (새창열림)

'Programming > Python' 카테고리의 다른 글

pip에서 ImportError: cannot import name 'main' 를 해결하자  (0) 2019.09.20
imread, imwrite 에서 한글(유니코드)로 인한 문제를 해결하자  (3) 2019.09.04
list 생성과 초기화 같이 하자  (0) 2019.08.14
list 에서 최대값과 최대값의 index를 찾아보자  (0) 2019.08.14
numpy의 array를 저장하고 읽어보자  (0) 2019.08.08
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

list 생성과 초기화 같이 하자

Programming/Python 2019. 8. 14. 15:26




c 에서는 임의의 길이의 배열을 생성할때 그 길이를 넣어줘서 생성했었다.

파이썬에서는 사용법이 약간 다르니 메모메모.

 

1. 0으로 초기화 된 배열 생성

    $ nList = [0 for _ in range(길이)]

 

2. random 값으로 초기화 된 배열 생성

1번과 동일한 방식이지만 초기화 값을 random 함수를 사용한다는 점만 다르다.

    $ import random

    $ fList = [random.random() for _ in range(길이)]

'Programming > Python' 카테고리의 다른 글

imread, imwrite 에서 한글(유니코드)로 인한 문제를 해결하자  (3) 2019.09.04
python 2.X에서 dump한 pickle 3.X 버전에 읽기  (0) 2019.09.03
list 에서 최대값과 최대값의 index를 찾아보자  (0) 2019.08.14
numpy의 array를 저장하고 읽어보자  (0) 2019.08.08
conda를 이용한 가상환경 설정  (0) 2019.03.05
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,
  • «
  • 1
  • 2
  • 3
  • »

카테고리

  • 살다보니.. (450)
    • 주절거림 (3)
    • 취미생활 (36)
      • 지식과 지혜 (3)
      • 풍경이 되어 (4)
      • Memories (17)
      • 엥겔지수를 높여라 (2)
    • mathematics (6)
      • Matrix Computation (2)
      • RandomProcesses (3)
    • English.. (8)
    • Programming (147)
      • C, C++, MFC (51)
      • C# (1)
      • OpenCV (17)
      • Python (58)
      • Git, Docker (3)
      • Matlab (4)
      • Windows (3)
      • Kinect V2 (2)
      • 기타 etc. (8)
    • 전공관련 (80)
      • Algorithm (6)
      • Deep Learning (54)
      • 실습 프로그램 (4)
      • 주워들은 용어정리 (8)
      • 기타 etc. (8)
    • Computer (120)
      • Utility (21)
      • Windows (31)
      • Mac (4)
      • Ubuntu, Linux (60)
      • NAS (2)
      • Embedded, Mobile (2)
    • IT, Device (41)
      • 제품 사용기, 개봉기 (14)
      • 스마트 체험단 신청 (27)
    • Wish List (3)
    • TISTORY TIP (5)
    • 미분류. 수정중 (1)

태그목록

  • 매트랩
  • 크롬
  • DSLR
  • 큐슈
  • LIBSVM
  • 에누리닷컴
  • 일본
  • Deep Learning
  • utility
  • function
  • 매트랩 함수
  • matlab function
  • 스마트체험단
  • ReadString
  • 딥러닝
  • matlab
  • DeepLearning
  • portugal
  • SVM
  • Computer Tip
  • 후쿠오카
  • Convolutional Neural Networks
  • review
  • 갤럭시노트3
  • CStdioFile
  • 포르투갈
  • 칼로리 대폭발
  • 오봉자싸롱
  • ColorMeRad
  • random variable

달력

«   2025/12   »
일 월 화 수 목 금 토
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
12-19 01:27

LATEST FROM OUR BLOG

RSS 구독하기

BLOG VISITORS

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015 Socialdev. All Rights Reserved.

티스토리툴바