diff --git a/pysam/libcutils.pyx b/pysam/libcutils.pyx index 7a03f3c4..322cf675 100644 --- a/pysam/libcutils.pyx +++ b/pysam/libcutils.pyx @@ -46,14 +46,20 @@ cpdef array_to_qualitystring(c_array.array qualities, int offset=33): """convert an array of quality values to a string.""" if qualities is None: return None - cdef int x - cdef c_array.array result - result = c_array.clone(qualities, len(qualities), zero=False) + cdef Py_ssize_t n = len(qualities) - for x from 0 <= x < len(qualities): - result[x] = qualities[x] + offset - return force_str(result.tobytes()) + cdef bytearray result_ba = bytearray(n) + + cdef char[:] qualities_view = qualities + cdef unsigned char[:] result_view = result_ba + + cdef Py_ssize_t i + + for i in range(n): + result_view[i] = qualities_view[i] + offset + + return force_str(bytes(result_ba)) cpdef qualities_to_qualitystring(qualities, int offset=33): diff --git a/tests/libcutils_bench.py b/tests/libcutils_bench.py new file mode 100644 index 00000000..98d469b7 --- /dev/null +++ b/tests/libcutils_bench.py @@ -0,0 +1,10 @@ +"""Benchmarking the libcutils module. Usage:: + +pytest tests/libcutils_bench.py +""" +import pysam + + +def test_qualitystring_to_array_long_sequences(benchmark): + result = benchmark(pysam.array_to_qualitystring, pysam.qualitystring_to_array("123") * 500) + assert result == "123" * 500 diff --git a/tests/libcutils_test.py b/tests/libcutils_test.py new file mode 100644 index 00000000..0febafaa --- /dev/null +++ b/tests/libcutils_test.py @@ -0,0 +1,10 @@ +"""Benchmarking the libcutils module. Usage:: + +pytest tests/libcutils_bench.py +""" +import pysam + + +def test_qualitystring_to_array_empty(): + result = pysam.array_to_qualitystring(pysam.qualitystring_to_array("")) + assert result == ""