presents an extremely thorough experiment that goes on for many, many pages. The author describes one scenario which did 85 inserts per second, and another which produced 96,000. The most important factor is the use of SQL transactions.
It is crucial to remember that even though SQLite implements a dialect of SQL, all of the physical operations that it performs are to a shared file. It must employ file-locking semantics which might vary (considerably) from one OS-type to another, or (network?) filesystem-type to another, all while maintaining for the application (programmer) the familiar semantics of SQL which of course (by design) knows nothing of such things.
A database server is capable of performing "lazy writes," as it maintains a set of in-memory buffers within the server process, e.g. to provide up-to-date data to a new request even though that data has not yet been written to disk. A shared-file architecture by definition cannot do that.
For more details: