dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

cython プログラムを含む python パッケージの作成方法

2019-01-20 15:00:42 | python
cython プログラムを含む python パッケージの作成方法のメモ。

■ディレクトリ構成
foo_root
├── setup.py
└── foo
     ├── __init__.py
     ├── module1.pyx
     ├── module2.pyx
     └── bar
          ├── __init__.py
          └── module3.pyx


■setup.py
from distutils.core import setup
from Cython.Build import cythonize
from setuptools import setup, find_packages, Extension


setup(name='foo',
      version='1.0.0',
      description='...',
      author='foo',
      author_email='foo@bar.com',
      url='http://.../',
      install_requires=[
          "numpy==1.15.4"
      ],

      zip_safe=False,
      packages=['foo', 'foo.bar'],
      package_dir={
          'foo': 'foo',
          'foo.bar': 'foo/bar'
      },

      ext_modules=[
          Extension('foo.module1', sources=['foo/module1.pyx']),
          Extension('foo.module2', sources=['foo/module2.pyx']),
          Extension('fooo.bar.module3', sources=['foo/bar/module3.pyx'])
      ]
)

※zip_safe=False がないと、from foo.module1 import Module1 でエラーが発生した。

■インストール
python setup.py install


■インストールされたパッケージ一覧
pip list


■アンインストール
pip uninstall foo

foo は setup.py 中で name で指定したパッケージ名

■cython で生成した .c、.so などの削除
python setup.py clean --all


python と cython でリストとハッシュの処理速度を比較

2019-01-02 09:10:27 | python
python と cython でリストとハッシュの処理速度を比較をしてみたメモ。

リストの方が速いという結果でしたが、劇的な差があるわけではありませんでした。
python_arr: 0.23327970504760742
python_dic: 0.2285747528076172
cython_arr: 0.1210927963256836
cython_dic: 0.17387104034423828


# -*- coding:utf-8 -*-
#
# array vs hash
#

import time
import test


def p_arr(obj):
    a = obj[0]
    a = obj[1]
    a = obj[2]
    a = obj[3]
    a = obj[4]

    return a


def p_dic(obj):
    a = obj['item0']
    a = obj['item1']
    a = obj['item2']
    a = obj['item3']
    a = obj['item4']

    return a


def run():
    n = 1000000

    arr = [0, 1, 2, 3, 4]
    dic = {'item0': 0, 'item1': 1, 'item2': 2, 'item3': 3, 'item4': 4}

    # python arr
    from_time = time.time()
    # 実行
    for i in range(n):
        p_arr(arr)
    to_time = time.time()
    t = to_time - from_time
    print("python_arr: %s" % (t))

    # python dic
    from_time = time.time()
    # 実行
    for i in range(n):
        p_dic(dic)
    to_time = time.time()
    t = to_time - from_time
    print("python_dic: %s" % (t))


    # cython arr
    from_time = time.time()
    # 実行
    for i in range(n):
        test.c_arr(arr)
    to_time = time.time()
    t = to_time - from_time
    print("cython_arr: %s" % (t))

    # cython dic
    from_time = time.time()
    # 実行
    for i in range(n):
        test.c_dic(dic)
    to_time = time.time()
    t = to_time - from_time
    print("cython_dic: %s" % (t))

    return 0


if __name__ == '__main__':
    res = run()
    exit(res)


# -*- coding:utf-8 -*-
# cython: language_level=3
#
#


DEF C_ITEM0 = 0
DEF C_ITEM1 = 1
DEF C_ITEM2 = 2
DEF C_ITEM3 = 3
DEF C_ITEM4 = 4


def c_arr(list obj):
    #cdef int C_ITEM0 = 0
    #cdef int C_ITEM1 = 1
    #cdef int C_ITEM2 = 2
    #cdef int C_ITEM3 = 3
    #cdef int C_ITEM4 = 4
    cdef int a

    a = obj[C_ITEM0]
    a = obj[C_ITEM1]
    a = obj[C_ITEM2]
    a = obj[C_ITEM3]
    a = obj[C_ITEM4]

    return a


def c_dic(dict obj):
    cdef int a

    a = obj['item0']
    a = obj['item1']
    a = obj['item2']
    a = obj['item3']
    a = obj['item4']

    return a