Как разработать сравнение строк в cython для скорости?

avatar
user_12
1 июля 2021 в 20:12
42
0
0

Я пытаюсь выполнить сравнение строк между двумя объектами,

%load_ext cython # jupyterlab

%%cython --annotate

skills1 = {
    "java": ["java", "j2ee"],
    "python": ["Cython", "pypi"],
    "application development": ["software development"],
}

skills2 = ["python", "j2ee", "software development"]
cdef int count = 0
for i, vals in skills1.items():
    for j in skills2:
        if j == i or j in vals:
            count += 1
            break

print("score", (count / len(coreskills))*100)

Благодаря тегу --annotate я смог узнать, есть ли какое-либо взаимодействие с Python, но все строки, кроме одной, были желтыми.

Поэтому я думаю, что не оптимизирую код. Может ли кто-нибудь помочь мне написать эту функциональность на cython, чтобы я мог получить скорость.

примечание: переменные skills1 and 2 — это словарь и список python, которые возвращаются другой функцией, я не знаю, как преобразовать их в словарь cython и массив cython

Источник
DavidW
1 июля 2021 в 20:29
1

«Я не знаю, как преобразовать их в словарь cython и массив cython» - словаря Cython не существует. Массив Cython существует, но на самом деле он предназначен для числовых данных, поэтому он вам мало поможет]

hpaulj
1 июля 2021 в 20:33
0

Есть ли у cython собственные строки и строковые методы на основе C? Или это все еще строки Python?

hpaulj
1 июля 2021 в 21:29
1

items() преобразует dict в список (списки ol). i и j — это строки Python. j==i и j in vals используют тесты на равенство строк Python. Строки Python представляют собой юникод, что значительно сложнее, чем байтовые строки/ASCII Py2, где символы представляют собой одиночные байты (7 бит). Исходные строки, встроенные в c, были «Строки на самом деле представляют собой одномерный массив символов, заканчивающийся нулевым символом», но существуют различные библиотеки многобайтовых строк.

user_12
2 июля 2021 в 00:57
0

@hpaulj Значит, я не могу оптимизировать его дальше?

user_12
2 июля 2021 в 00:58
1

@DavidW, так что я должен просто придерживаться python, если cython не предлагает больших преимуществ в производительности. Я предполагал, что cython ускорит процесс.

DavidW
2 июля 2021 в 06:10
0

Одним из подходов было бы использование типов С++ в Cython. Это стоило бы того, если бы вы могли генерировать свои данные в Cython, но, вероятно, нет, если данные поступают из Python. Предположительно ваш пример, если урезанный и у вас большие источники данных, которые как-то подгружаются?

Ответы (0)