我可能已经找到了一个写作比写作慢的原因.在查看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是唯一的瓶颈.