code: def test_put_many_benchmark(
      benchmark, tempdir, inject_failure_rate, s3root, blobs, expected
  ):
      def _generate_files(blobs):
          generated_paths = {}
          for blob in blobs:
              count, blob_info = blob
              if blob_info in generated_paths:
                  for _ in range(count):
                      yield str(uuid4()), generated_paths[blob_info]
              else:
                  prefix, fname, size = blob_info
                  data = s3_data.RandomFile(prefix, fname, size)
                  key = str(uuid4())
                  path = os.path.join(tempdir, key)
                  with open(path, "wb") as f:
                      f.write(data.data)
                  generated_paths[blob_info] = path
                  for _ in range(count):
                      yield str(uuid4()), path
  
      all_files = list(_generate_files(blobs))
  
      def _do():
          new_files = [(str(uuid4()), path) for _, path in all_files]
          with S3(
              s3root=s3root, inject_failure_rate=inject_failure_rate
          ) as s3:
              s3urls = s3.put_files(new_files, overwrite=False)
          return s3urls
  
      res = benchmark(_do)
  
imports: import os
  from re import I
  import shutil
  from hashlib import sha1
  from tempfile import mkdtemp
  from itertools import groupby, starmap
  import random
  from uuid import uuid4
  from metaflow.plugins.datatools import s3
  import pytest
  from metaflow import current, namespace, Run
  from metaflow.plugins.datatools.s3 import S3, MetaflowS3AccessDenied, MetaflowS3NotFound, MetaflowS3URLException, MetaflowS3InvalidObject, S3PutObject, S3GetObject
  from metaflow.util import to_bytes, unicode_type
  from .None import s3_data
  from ..None import FakeFlow, DO_TEST_RUN
label_desc: Use image node_id 11 for calling a global function with example usage: test_put_many_benchmark(benchmark, tempdir, inject_failure_rate, s3root, blobs, expected) and returns: s3urls