Você pode fazer algo muito mais simples que também será consideravelmente mais rápido. Observe que essa abordagem só funciona quando você é capaz de armazenar todo o conteúdo do arquivo em memória contígua e o limite rígido atual é de 1 GB, mesmo se você tiver muitos terabytes de RAM disponíveis!
cursor.execute("insert into t (id, b) values (:my_id, :my_blob)",
(1, mem_file.getvalue())
Inserir um valor empty_blob() e retornar o localizador LOB para atualização posterior é mais rápido do que criar um LOB temporário e inseri-lo (como você está fazendo em seu código), mas inserir os dados diretamente é ainda mais rápido!