Во-первых, я использую Cython 0.18 с Python 2.7.4. Я испытываю довольно странную ошибку, и я не уверен, почему. Вот код игрушка:неожиданный вывод и возвращаемое значение с Cython
from cpython cimport bool
cpdef unsigned int func(char *seq1, char *seq2, bool case_sensitive=True):
print 'seq1', seq1, len(seq1)
print 'seq2', seq2, len(seq2)
print
#take care of case sensitivity
if not case_sensitive:
#this is kinda hacky, but I've gotta assign the lowercased string to a Python object before assigning it back to char *
#see http://docs.cython.org/src/userguide/language_basics.html#caveats-when-using-a-python-string-in-a-c-context
temp = seq1.lower()
seq1 = temp
temp = seq2.lower()
seq2 = temp
print 'seq1', seq1, len(seq1)
print 'seq2', seq2, len(seq2)
print
#trim common characters at the beginning of the words
while len(seq1) > 0 and len(seq2) > 0 and seq1[0] == seq2[0]:
temp = seq1[1:]
seq1 = temp
temp = seq2[1:]
seq2 = temp
print 'seq1', seq1, len(seq1)
print 'seq2', seq2, len(seq2)
print
#handle degenerate cases
if not seq1:
return len(seq2)
if not seq2:
return len(seq1)
Вот пример вызова:
>>> from func import func
>>> print func('TUESDAYs', 'tuesday', False)
Теперь, что я ожидал увидеть, если следующее:
seq1 TUESDAYs 8
seq2 tuesday 7
seq1 tuesdays 8
seq2 tuesday 7
seq1 s 1
seq2 0
1
Но то, что я на самом деле вижу это:
seq1 TUESDAYs 8
seq2 tuesday 7
seq1 tuesdays 8
seq2 tuesday 7
seq1 stdout 6
seq2 tuesday 7
0
Что, черт возьми, goi ng здесь? Прежде всего, почему вывод stdout
? Почему я не получаю вывод, который должен получить? Это ошибка Cython, или я просто пропустил что-то тривиальное здесь?
Я замечаю, что вы используете 'seq1' и' seq2' как объекты 'str' с самого начала, и я буду держать пари, если вы добавите явное преобразование (изменение params to 's1' и' s2', тогда напишите 'str1, str2 = str (s1), str (s2)' вверху), проблема исчезнет. (По крайней мере, стоит проверить.) – abarnert
Это обходное решение, необходимое для взаимодействия с объектами '' char * '' и Python '' str''. У меня есть комментарий в коде, который описывает, почему я это делаю. Ваша идея литья seq1 и seq2 на str интересна. Я попробую. Вернитесь назад ... – Geoff
Да, я понял, что часть и удалил комментарий. Но это вдохновило второй комментарий. Вы не получаете каких-либо преимуществ от использования char * внутри - на самом деле, я думаю, что вы делаете это медленнее. Для каждого промежуточного шага вы создаете объект 'str' Python, выполняете' str' операции, сохраняете результаты 'str', а затем делаете' seq1' в этом буфере 'str'. И затем вы создаете новую 'str' из' seq1', когда вы могли бы просто вернуть старый, если бы вы не обманули Cython. – abarnert