作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找代码的优化以避免以下错误并使我的程序更快。调用 Python 对象时超出最大递归深度
我希望在 Docker 容器中执行此代码。它在我的机器本地完美运行。
我正在寻找一种减少循环次数的方法。
def reidentify(self):
try:
# Check if file is re-identify
self.check_if_dicom_is_reidentify()
LOGGER.info(f"Anonymization in progress for {self.dirpath_output}")
# Get patient data
json_data = json.loads(self.get_patient_data().decode('utf-8'))
# Re-identification
archive = zipfile.ZipFile(self.download.dirpath_download, 'r')
for file in archive.namelist():
# Check if the file is a dicom
if not file.endswith('.dcm'):
continue
# Reading dicom file
dicom_data = io.BytesIO(archive.read(file))
ds = pydicom.dcmread(dicom_data)
# Edit Dicom general fields
for key in json_data['tags']:
ds.data_element(key).value = json_data['tags'][key]
# Edit Dicom series field
for key in json_data['series']:
if key['obfuscated_uid'] != ds.data_element('SeriesInstanceUID').value:
continue
for tag in key['tags']:
ds.data_element(tag).value = key['tags'][tag]
# Save re-identify dicom
ds.save_as(f'{self.dirpath_tmp}/{os.path.basename(file)}')
except Exception as e:
LOGGER.error(e)
这段代码给出了预期的结果,但我认为这不是一个优化的方法,而且非常慢。
编辑:这是堆栈跟踪
reidentify_1 | 2019-10-17 11:29:53,001] With tag (0010, 1030) got exception: maximum recursion depth exceeded while calling a Python object
reidentify_1 | Traceback (most recent call last):
reidentify_1 | File "/usr/local/lib/python3.8/site-packages/pydicom/tag.py", line 30, in tag_in_exception
reidentify_1 | yield
reidentify_1 | File "/usr/local/lib/python3.8/site-packages/pydicom/filewriter.py", line 541, in write_dataset
reidentify_1 | write_data_element(fp, dataset.get_item(tag), dataset_encoding)
reidentify_1 | File "/usr/local/lib/python3.8/site-packages/pydicom/filewriter.py", line 485, in write_data_element
reidentify_1 | writer_function(buffer, data_element)
reidentify_1 | File "/usr/local/lib/python3.8/site-packages/pydicom/filewriter.py", line 338, in write_number_string
reidentify_1 | val = str(val)
reidentify_1 | File "/usr/local/lib/python3.8/site-packages/pydicom/valuerep.py", line 344, in __str__
reidentify_1 | return super(DSfloat, self).__str__()
reidentify_1 | File "/usr/local/lib/python3.8/site-packages/pydicom/valuerep.py", line 347, in __repr__
reidentify_1 | return "\"" + str(self) + "\""
非常感谢您的帮助。
最佳答案
好像是fixed但没有pypi package使用该修复程序构建。
该bug的根源描述如下:
<小时/>Python 3.8 removes str() from int and float which instead now call object.str() which itself defaults to object.repr().
DSfloat.str(), DSfloat.repr() and IS.repr() all call the parent class' str() which calls the subclass' repr() method and so on, which causes a recursion error.
This PR:
Fixes DSfloat.__str__() by creating a calling repr() instead and removing the " marks.
Fixes DSfloat.__repr__() by calling the parent class' __repr__() instead of str()
Fixes IS.__repr__() by implementing IS.__str__() in a similar manner to DSfloat.__str__() and making IS.__repr__() symmetric withDSfloat.repr()
您可以尝试直接从 git 存储库安装它:
pip uninstall pydicom
pip install git+https://github.com/pydicom/pydicom.git
关于python - 递归错误: I'm looking for a way to reduce the number of the loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58432935/
我是一名优秀的程序员,十分优秀!