code: def save_features(features, location=None, profile_name=None):
      """Saves the features list as JSON to a specified filepath/S3 path, writes to an open file, or
      returns the serialized features as a JSON string. If no file provided, returns a string.
  
      Args:
          features (list[:class:`.FeatureBase`]): List of Feature definitions.
  
          location (str or :class:`.FileObject`, optional): The location of where to save
              the features list which must include the name of the file,
              or a writeable file handle to write to. If location is None, will return a JSON string
              of the serialized features.
              Default: None
  
          profile_name (str, bool): The AWS profile specified to write to S3. Will default to None and search for AWS credentials.
                                      Set to False to use an anonymous profile.
  
      Note:
          Features saved in one version of Featuretools are not guaranteed to work in another.
          After upgrading Featuretools, features may need to be generated again.
  
      Example:
          .. ipython:: python
              :suppress:
  
              from featuretools.tests.testing_utils import (
                  make_ecommerce_entityset)
              import featuretools as ft
              es = make_ecommerce_entityset()
              import os
  
          .. code-block:: python
  
              f1 = ft.Feature(es["log"].ww["product_id"])
              f2 = ft.Feature(es["log"].ww["purchased"])
              f3 = ft.Feature(es["log"].ww["value"])
  
              features = [f1, f2, f3]
  
              # Option 1
              filepath = os.path.join('/Home/features/', 'list.json')
              ft.save_features(features, filepath)
  
              # Option 2
              filepath = os.path.join('/Home/features/', 'list.json')
              with open(filepath, 'w') as f:
                  ft.save_features(features, f)
  
              # Option 3
              features_string = ft.save_features(features)
      .. seealso::
          :func:`.load_features`
      """
      return FeaturesSerializer(features).save(
          location, profile_name=profile_name
      )
  
file_path: featuretools/featuretools/feature_base/features_serializer.py
imports: import json
  from featuretools.primitives.utils import serialize_primitive
  from featuretools.utils.s3_utils import get_transport_params, use_smartopen_features
  from featuretools.utils.wrangle import _is_s3, _is_url
  from featuretools.version import FEATURES_SCHEMA_VERSION
  from featuretools.version import __version__
label_desc: Use image node_id 1 for calling a global function with example usage: save_features(features, location, profile_name) and returns: FeaturesSerializer