python 拷贝文件 效率_为什么逐行复制文件会大大影响Python中的复制速度?

本文探讨了Python中文件拷贝效率低下的原因,特别是逐行写入文件的方式如何影响速度。通过对CPython源代码的分析,发现`write()`函数在写入文件时会返回已写入的字符数,而`writelines()`则不返回,这可能导致性能差异。通过测试验证了这一现象,`write()`比`writelines()`更快,因为它避免了额外的函数调用来计算写入大小。
摘要由CSDN通过智能技术生成

我可能已经找到了一个写作比写作慢的原因.在查看CPython源代码(3.4.3)时,我发现了写入函数的代码(取出了不必要的部分).

模块/ _IO / fileio.c

static PyObject *

fileio_write(fileio *self, PyObject *args)

{

Py_buffer pbuf;

Py_ssize_t n, len;

int err;

...

n = write(self->fd, pbuf.buf, len);

...

PyBuffer_Release(&pbuf);

if (n < 0) {

if (err == EAGAIN)

Py_RETURN_NONE;

errno = err;

PyErr_SetFromErrno(PyExc_IOError);

return NULL;

}

return PyLong_FromSsize_t(n);

}

如果您注意到,此函数实际返回一个值,即已写入的字符串的大小,这是另一个函数调用.

我测试了这个,看看它是否真的有一个返回值,它是.

with open('test.txt', 'w+') as f:

x = f.write("hello")

print(x)

>>> 5

以下是CPython中写入函数实现的代码(取出不必要的部分).

模块/ _IO / iobase.c

static PyObject *

iobase_writelines(PyObject *self, PyObject *args)

{

PyObject *lines, *iter, *res;

...

while (1) {

PyObject *line = PyIter_Next(iter);

...

res = NULL;

do {

res = PyObject_CallMethodObjArgs(self, _PyIO_str_write, line, NULL);

} while (res == NULL && _PyIO_trap_eintr());

Py_DECREF(line);

if (res == NULL) {

Py_DECREF(iter);

return NULL;

}

Py_DECREF(res);

}

Py_DECREF(iter);

Py_RETURN_NONE;

}

如果你注意到没有返回值!它只是具有Py_RETURN_NONE而不是另一个函数调用来计算写入值的大小.

所以,我进行了测试,确实没有一个返回值.

with open('test.txt', 'w+') as f:

x = f.writelines(["hello", "hello"])

print(x)

>>> None

写入的额外时间似乎是由于在实现中获取的额外的函数调用产生返回值.通过使用写作,您跳过该步骤,fileio是唯一的瓶颈.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值